1

目前我正在通过屏幕抓取来抓取足球赛程,每次执行 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 任务中的创建会先检查这个吗?

任何帮助表示赞赏

4

2 回答 2

3

几种选择:

一枪(从 Rails 3.2.13 开始):

Fixture.where(home_team: home_team, away_team: away_team, fixture_date: date, kickoff_time: kick_off).first_or_create!
于 2013-05-14T20:06:43.010 回答
1

你可以使用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_ 调用的,如果对象已经存在则返回,否则创建它,然后返回它。

如果您对 find_or_create_by_ 有其他参数,则必须将所有参数作为散列传递。

于 2013-05-14T20:08:27.687 回答