【问题标题】:Only save the records that don't exist只保存不存在的记录
【发布时间】:2013-05-14 19:52:15
【问题描述】:

目前我正在通过屏幕抓取抓取足球赛程,每次执行 rake 任务时,我都会删除所有记录并保存新记录..我不想这样做,我只想保存赛程那不存在。到目前为止我的逻辑是

def get_fixtures # Get me all Home and away Teams
 doc = Nokogiri::HTML(open(FIXTURE_URL))
 days = doc.css('#fixtures-data h2').each do |h2_tag|
 date = Date.parse(h2_tag.text.strip).to_date
  matches = h2_tag.xpath('following-sibling::*[1]').css('tr.preview')
  matches.each do |match|
    home_team = match.css('.team-home').text.strip
    away_team = match.css('.team-away').text.strip
    kick_off = match.css('td.kickoff').text.strip
     Fixture.create!(home_team: home_team, away_team: away_team, fixture_date: date, kickoff_time: kick_off)
 end
end

结束

最好的方法是什么,另一种检查记录是否存在的方法?但不确定如何处理这个

我的夹具模型

class Fixture < ActiveRecord::Base
  attr_accessible :home_team, :away_team, :fixture_date, :kickoff_time, :prediction_id

  belongs_to :predictions
end

我可以在夹具模型中使用 validates_uniqueness_of,我在 rake 任务中的创建会先检查这个吗?

任何帮助表示赞赏

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 model


    【解决方案1】:

    几个选择:

    One Shot(从 Rails 3.2.13 开始):

    Fixture.where(home_team: home_team, away_team: away_team, fixture_date: date, kickoff_time: kick_off).first_or_create!
    

    【讨论】:

    • 谢谢,这对速度有影响吗?
    • @Richlewis,由于首先检查记录是否存在而导致的轻微颠簸。但是,这是对这项任务的关注吗?如果是这样,您可以使用直接 SQL。在 mysql 的情况下,使用“INSERT IGNORE”。
    • 在这种情况下并没有什么不同,因为我猜只有少量数据,我只是好奇
    • guides.rubyonrails.org/… 了解更多信息
    【解决方案2】:

    你可以使用find_or_create_by_方法:

    Fixture.find_or_create_by_home_team(home_team: home_team, away_team: away_team, fixture_date: date, kickoff_time: kick_off)
    

    如果对象尚不存在,则可以使用此动态查找器创建对象。这个动态查找器是用 find_or_create_by_ 调用的,如果对象已经存在则返回,否则创建它,然后返回它。

    如果您有其他参数要查找_or_create_by_,则必须将所有参数作为散列传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多