我可能在这里寻找错误的东西,我很蠢,所以让我解释一下。
我有一个rake任务,它通过cron每10分钟轮询一次Web服务,响应是JSON。
对于响应中的每个项目,我只有在某个列具有唯一值时才需要创建记录,在这种情况下是一个哈希值。
这是任务的核心:
response.parsed_response['items'].each do |item|
Item.create({
:item_hash => item['item_hash']
})
end
问题是,如果hash
值是唯一的,我只想这样做,这是基本的行为还是我在ActiveRecord中缺少一些明显的方法?
答案 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中执行此操作。
希望这有帮助!