This is close.
data = %w(number id horse age sex colour)
def extract_value(path_id, data)
@doc.search('race').map do |race|
puts path_id
extracted_data =
race.search(path_id).map do |node|
{}.tap do |hash|
data.each {|d| hash[d.to_sym] = Integer(node[d])}
end
end
values = { race['id'].to_i => extracted_data }
ap values
# next line will prematurely return from the method,
# do you want that?
return values
end
end
extract_value('nomination', data _______________________________________________________________________________
However not all values are integers, some are strings.
Can you make templates that you can drop into the function?
I started down the path of trying to build a factory to generate structures based on input type and while it works I think creating a template like I would in web would make sense.
Creating template ____________________________________________________________________
def data_form(_id, path = 'nomination')
terms = %w(one two three)
noms = terms.collect { |x| path.to_s + "[#{x}].to_i" }
puts noms
end
____________________________________________________________________
If I just defined the templates as:
structure = {
number: nomination['number'].to_i,
id: nomination['id'].to_i,
horse: nomination['horse'].to_s,
age: nomination['age'].to_i,
sex: nomination['sex'].to_s,
colour: /\W(.+?)\d?\s/.match(nomination['description'].to_s)[1]
}
Then the method could be really simplified to just take in the node and the template to use.
Just Like
def extract_value(_node, data)
term = 'node' + 's'
@doc.search('race').map do |race|
term = race.search('node')
.map do |_node|
data
end
end
a = { race['id'].to_i => term }
ap a
end
extract_value('nomination', structure)
Sayth
PS I learnt tap from your previous post I had thought it was a typo of map but no
http://ruby-doc.org/core-2.3.1/Object.html#method-i-tap :-)
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)