Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.ruby > #7271

extract into a method - struggling to abstract

Newsgroups comp.lang.ruby
Date 2016-07-03 07:01 -0700
Message-ID <df5ec7e9-0d75-4810-9f8c-5396113e8cc4@googlegroups.com> (permalink)
Subject extract into a method - struggling to abstract
From Sayth Renshaw <flebber.crue@gmail.com>

Show all headers | View raw


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'))

@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.

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)

_______________________________________________________________________________

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?

Cheers

Sayth

Back to comp.lang.ruby | Previous | NextNext in thread | Find similar


Thread

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