2014-05-05 52 views
1

可以说我有一个型号ProductRails:检查DB中是否存在新记录的最有效方法

偶尔我得到一个包含新产品的文件,问题是其中一些文件可能已经输入到数据库中。

数据不包含任何唯一键,并且可以使用不同的字段以不同的结构进行结构化。我可以做的是根据我拥有的所有数据从数据库中选择,如果找到产品,则不要从文件中保存该数据。

Product.where(:name => p.name, :desc => p.desc, :source => "some source", [more fields]) 

所以我的问题是,如果有更好的方式铁轨检查记录已经存在?

插入失败的一些独特的关键,是不是一个好主意国际海事组织,但也可以工作。

+2

添加桌子上的“独一无二的钥匙”永远是一种高效且最值得推荐的方式。而且它也让你的生活更轻松。相信我。 – Pavan

+1

除了首先查看记录以外,还有其他方法是否知道记录是否存在?这种方法有什么问题吗?它是否需要太长时间?唯一性问题是您想要解决的问题,还是您试图解决缓慢/设计问题?你的产品没有UPC或其他什么指定它们是唯一的? – jefflunt

+0

对不起,我错过了'rails'这个词。我的问题是否有一个更好的轨道方式来检查这个选择或插入可能是唯一的概念性方式来做到这一点... – SimonW

回答

3

可以使用exist?功能是这样的:

if Product.where(:name => p.name, :desc => p.desc, :source => "some source", [more fields]) 
    # do something 
else 
    # do something else 
end 

您也可以使用find_or_create_by如果你的目标是,如果它不存在,这样创造一个新的纪录:

Product.find_or_create_by(:name => p.name, :desc => p.desc, :source => "some source", [more fields]) 
+1

'find_or_create_by'是一种方式去这里。 – Pavan

+0

按照你的建议,我使用了'find_or_initialize_by',因为我不想立即创建记录。谢谢! – SimonW

相关问题