Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.ruby > #7272
| From | Robert Klemme <shortcutter@googlemail.com> |
|---|---|
| Newsgroups | comp.lang.ruby |
| Subject | Re: extract into a method - struggling to abstract |
| Date | 2016-07-03 18:52 +0200 |
| Message-ID | <dtsu6eFnso6U1@mid.individual.net> (permalink) |
| References | <df5ec7e9-0d75-4810-9f8c-5396113e8cc4@googlegroups.com> |
On 03.07.2016 16:01, Sayth Renshaw wrote:
> Hi
>
> I have working code that I have currently loops through an example returning matches via nokogiri module.
>
> This works
>
> require 'nokogiri'
> require 'awesome_print'
>
> @doc = Nokogiri::XML(File.open('/home/sayth/data/20160702RHIL0.xml'))
You are not closing the file here. Better:
@doc = File.open('/home/sayth/data/20160702RHIL0.xml', 'rb') do |io|
Nokogiri::XML(io)
end
> @doc.search('race').map do |race|
> nominations = race.search('nomination')
> .map do |nomination|
> {
> 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]
> }
> end
>
> a = { race['id'].to_i => nominations }
> ap a
> end
>
> _______________________________________________________________________________
>
> So at this point I know that I need to replicate this for 6 sections in total, logically to me then I want to abstract especially the middle.
>
> {
> 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]
> }
>
> and substitute a variable into race.search('nomination') this to replace the word nomination and to then replace all 'nomination' in the above section.
I would replace the variable name "nomination" by something more
abstract, e.g. "node".irb
> So this is what I have done.
>
> data = %w(number id horse age sex colour)
>
> def extract_value(path_id, data)
> @doc.search('race').map do |race|
> puts path_id
> nominations = race.search(path_id)
> .map do | |
> data
> end
> values = { race['id'].to_i => nominations }
> ap values
> return values
> end
> end
>
> extract_value('nomination', data)
I think you are almost there:
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)
> _______________________________________________________________________________
>
> The main part I cannot wrap my head around is how to get these sections in without replicating it in the definition.
>
> number: nomination['number'].to_i,
>
> How can I better abstract this out?
See above. Is this what you intended?
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
Back to comp.lang.ruby | Previous | Next — Previous in thread | Next in thread | Find similar
extract into a method - struggling to abstract Sayth Renshaw <flebber.crue@gmail.com> - 2016-07-03 07:01 -0700
Re: extract into a method - struggling to abstract Robert Klemme <shortcutter@googlemail.com> - 2016-07-03 18:52 +0200
Re: extract into a method - struggling to abstract Sayth Renshaw <flebber.crue@gmail.com> - 2016-07-04 05:58 -0700
Re: extract into a method - struggling to abstract Sayth Renshaw <flebber.crue@gmail.com> - 2016-07-04 04:27 -0700
Re: extract into a method - struggling to abstract Robert Klemme <shortcutter@googlemail.com> - 2016-07-05 23:21 +0200
csiph-web