Ruby数组搜索方法无法按预期工作

时间:2018-03-18 11:44:43

标签: arrays ruby search methods

我无法使用我在脚本中编写的搜索方法来工作。以下是脚本中的相关代码:

$records = []

def xml_extractor(document)
    document.xpath("//record").each do |record|
        $records << {"id" => record.xpath('id').text, 
            "first_name" => record.xpath('first_name').text, 
            "last_name" => record.xpath('last_name').text, 
            "email" => record.xpath('email').text, 
            "gender" => record.xpath('gender').text, 
            "ip_address" => record.xpath('ip_address').text,
            "send_date" => record.xpath('send_date').text,
            "email_body" => record.xpath('email_body').text,
            "email_title" => record.xpath('email_title').text}
            puts record
        end
    puts "\nAll records loaded!"
end


def search_by_ip(ip)
    record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
    puts JSON.pretty_generate(record_to_return) 
end

基本上我的xml_extractor方法工作正常,它使用nokogiri将所有内容存储到数组中。正在实现的xml文件有一千条记录,每条记录都有自己的first_name,last_name等。但问题是当我尝试在数组上实现search_by_ip方法时,返回一个“null”值,当该方法真的应该是什么时候正在返回属于该特定IP地址的整个记录​​。此外,我意识到每次实现xml_extractor方法时,即当xml文档被解析到数组中时,内容实际上并未保存,而是仅在循环进行时显示。这可能就是我为我的搜索方法获得“null”的原因。让我知道你们的想法。

2 个答案:

答案 0 :(得分:0)

在ruby中,您的方法将返回最后一行。如果希望方法返回数据,则需要在最后一行返回它。 puts不会返回任何内容。 尝试改变这样:

def search_by_ip(ip)
  record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
  puts JSON.pretty_generate(record_to_return)
  record_to_return
end

答案 1 :(得分:0)

我写了一个如何使用OO来获得你想要的东西的例子。 我没有您的文档,所以我将您的文档简化为二维数组 在方法read中切换注释以使用xml 每种方法都可以链接,只做所需的方法 它们都可以分开测试(这里通过p&#39;它们)

class Xml_extractor

  attr_reader :document, :records

  def initialize document
    @document = document
    @records  = []
  end

  def read
    # @document.xpath("//record").each do |record|
    @document.each do |record|
      @records << {id: record[0], ip_address: record[1]}
    end
    self # return self so that you can chain another method
  end

  def search_by_ip(ip)
    #return first of an array if found, nil otherwise
    # attention to use a hash key here to search, not a string
    @records.select {|k| k[:ip_address] == ip.to_s}.first
  end

end

document = [[0, "192.168.0.1"], [1, "192.168.0.2"]]
p Xml_extractor.new(document).read.records
# [{:id=>0, :ip_address=>"192.168.0.1"}, {:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2")
# [{:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2").to_json
# "[{\"id\":1,\"ip_address\":\"192.168.0.2\"}]"