如何使用rake db:seed运行rails服务?

时间:2015-05-27 18:41:20

标签: ruby-on-rails

我在app / services中设置了一个服务,从政府那里提取文章。旅行警告和咨询的API(见下文)。我想做的是运行这个代码,它解析响应并在运行rake db:seed时保存到我的数据库。我不知道如何从种子文件中运行它 - 我可以运行Govt.request_data吗?

class Govt    

def self.request_data
  travel_alerts = request_data('http://travel.state.gov/_res/rss/TAs.xml')
  travel_warnings = request_data('http://travel.state.gov/_res/rss/TWs.xml')

  warnings_array = travel_warnings["rss"]["channel"]["item"]
  alerts_array = travel_alerts["rss"]["channel"]["item"]

  parse_and_save(warnings_array)
  parse_and_save(alerts_array)
end

def self.parse_and_save(advisory_array)
  advisory_array.each do |element|
    country_name_regex = element["title"].match(/.+?(?= Travel)/)
    country = Country.find_by(name: country_name_regex.to_s)

    if country 
      country.update(
        title: element["title"], 
        description: element["description"],
        publication_date: element["pubDate"])
      if element["description"].include?("This Travel Warning")
        country.update(advisory_type: "warning")
      else
        country.update(advisory_type: "alert")
      end
    end
  end
end

def self.request_data(link)
  Hash.from_xml(Net::HTTP.get_response(URI.parse(link)).body)
end

end

谢谢!

1 个答案:

答案 0 :(得分:2)

我重新构建了您的代码以简化操作。

class Govt

  def self.request_data(link)
    hash_from_api = Hash.from_xml(Net::HTTP.get_response(URI.parse(link)).body)
  end

  def self.get_array(hash_from_api)
    travel_alerts = request_data('http://travel.state.gov/_res/rss/TAs.xml')
    alerts_array = travel_alerts["rss"]["channel"]["item"]
  end

  def self.parse_and_save(advisory_array)
    advisory_array.each do |element|
      country_name_regex = element["title"].match(/.+?(?= Travel)/)
      country = Country.find_by(name: country_name_regex.to_s)

      if country
        country.update(
          title: element["title"],
          description: element["description"],
          publication_date: element["pubDate"])
        if element["description"].include?("This Travel Warning")
          country.update(advisory_type: "warning")
        else
          country.update(advisory_type: "alert")
        end
      end
    end
  end

end

在你的佣金任务中你可以做这样的事情

travel_alert_hash    = Govt.request_data('http://travel.state.gov/_res/rss/TAs.xml')
travel_warnings_hash = Govt.request_data('http://travel.state.gov/_res/rss/TAs.xml')

alerts_array   = Govt.get_array(travel_alert_hash)
warnings_array = Govt.get_array(travel_warnings_hash)

Govt.parse_and_save(alerts_array)
Govt.parse_and_save(warnings_array)

当然,您可以根据自己的需要重构上述代码,但这是它的基本要点。如果符合您的需要,请告诉我。

编辑:我已经创建了一个示例应用程序来进行测试,一切似乎都按预期工作。如果您需要访问示例应用程序,请告诉我。我非常乐意分享代码库。