Ruby on rails Rails:检查数据库中是否已经存在新记录的最有效方法

Ruby on rails Rails:检查数据库中是否已经存在新记录的最有效方法,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,假设我有一个型号产品 偶尔我会收到一个包含新产品的文件,问题是其中一些产品可能已经输入数据库 数据不包含任何唯一的键,并且数据的结构可能会因字段不同而有所不同。我能做的是根据我拥有的所有数据从数据库中进行选择,如果找到产品,则不保存文件中的产品 Product.where(:name => p.name, :desc => p.desc, :source => "some source", [more fields]) 所以我的问题是,是否有更好的rails方法来检查记录是否

假设我有一个型号
产品

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

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

Product.where(:name => p.name, :desc => p.desc, :source => "some source", [more fields])
所以我的问题是,是否有更好的rails方法来检查记录是否已经存在?

插入某个唯一密钥失败,在我看来不是个好主意,但也可以工作。

您可以使用如下功能:

if Product.where(:name => p.name, :desc => p.desc, :source => "some source", [more fields])
  # do something
else
  # do something else
end
Product.find_or_create_by(:name => p.name, :desc => p.desc, :source => "some source", [more fields])
如果您的目标是创建一个新记录,但该记录不存在,您也可以使用:

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

向表中添加一个
唯一键
始终是一种有效且最受推荐的方法。它还可以让您的生活更轻松。相信我。除了先查找记录外,您如何知道记录是否存在?这种方法有什么问题吗?是不是太久了?唯一性问题是您试图解决的问题,还是您试图解决缓慢/设计问题?您的产品没有UPC或其他指定为唯一的东西吗?对不起,我错过了
rails
这个词。我的问题是,是否有更好的rails方法来检查这一点,因为选择或插入可能是实现这一点的唯一概念性方法…
find_或_create_by
是一种方法。根据您的建议,我使用了
find_或_initialize_by
,因为我不希望立即创建记录。谢谢