Rails:如果记录具有唯一值,则保存记录?

时间:2011-03-25 00:27:52

标签: ruby-on-rails

我可能在这里寻找错误的东西,我很蠢,所以让我解释一下。

我有一个rake任务,它通过cron每10分钟轮询一次Web服务,响应是JSON。

对于响应中的每个项目,我只有在某个列具有唯一值时才需要创建记录,在这种情况下是一个哈希值。

这是任务的核心:

response.parsed_response['items'].each do |item|
  Item.create({
    :item_hash => item['item_hash']
  })
end

问题是,如果hash值是唯一的,我只想这样做,这是基本的行为还是我在ActiveRecord中缺少一些明显的方法?

2 个答案:

答案 0 :(得分:2)

使用find_or_create

Item.find_or_create_by_item_hash(item['item_hash'])

如果数据已存在,则不会创建项目。

如果您正在处理大量记录,我会使用以下方法:

all_hashes = response.parsed_response['items'].map{|item| item['item_hash']}
new_hashes = all_hashes - Item.all(:select => :item_hash, 
               :conditions => {:item_hash => all_hashes}).map(&:item_hash)
Item.create(new_hashes.map{|hash| {:item_hash => hash}})

答案 1 :(得分:1)

如果您想要使用Railsy路线,那么就像Pan Thomakos建议的那样,ActiveRecord验证是可行的方法。将ActiveRecord与非表格数据一起使用并没有错; AR不知道(或关心)数据来自何处。

还有一条SQL路由:您可以将唯一索引与INSERT IGNORE配对,只有在它们是唯一的时才会插入您的值。如果您需要知道插入是否成功,可以终止IGNORE并使用救援块(您也可以从MySQL获取“#rows changed”值,但我不知道如何在Rails中执行此操作。

希望这有帮助!