Its Me
1/21/2005 3:02:00 PM
"Luke Galea" <lgalea@gmmsolutions.com> wrote in message
> curious if there is a nice ruby way to express an xpath like navigation of
an
> object graph..
>
> XPATH way:
> Countries/Provinces/Cities[ @name = "London" ]
>
> The only Ruby way I can think of:
> countries.collect{ |c| c.provinces.collect {|p| p.cities.select { |c2|
c2#name
> == 'London' } } }
How about :
x[:countries][:provinces][:cities, {:name=>"London"}]
You could build up a query by composing query objects. To evaluate the query
you would have to treat each sub-query as evaluating to a result-set of
tree-like things, I believe (modulo optimizations). Can probably build up a
filtering proc and use #each to avoid actually constructing the result set.
class Q
attr_accessor :chain
def initialize
self.chain = []
end
def [](attr=nil, hash={})
f = Q.new
f.chain = self.chain.dup
if attr
f.chain << [attr, hash]
else
f.chain.last << hash
end
f
end
end
require 'pp'
x = Q.new
pp x
y=x[:a]
pp y
z=y[:b][:c][:d, {:foo=>"bar", :baz=>"bratz"}]
pp z
#==>
#<Q:0x28a4668 @chain=[]>
#<Q:0x28bec90 @chain=[[:a, {}]]>
#<Q:0x28b8c90
@chain=[[:a, {}], [:b, {}], [:c, {}], [:d, {:foo=>"bar", :baz=>"bratz"}]]>