Ruby on rails Rails-首先创建或添加重复记录?

Ruby on rails Rails-首先创建或添加重复记录?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,在我的rails应用程序中,我有一些种子,我正试图抓住它们。我将从有问题的代码开始: make = Make.where(value: 'Alfa Romeo').first_or_create model = make.models.where(value: '147').first_or_create trim = model.trims.where(value: '1.6 TS 3d (2001 - 2005)').first_or_create values = [ {value:

在我的rails应用程序中,我有一些种子,我正试图抓住它们。我将从有问题的代码开始:


make = Make.where(value: 'Alfa Romeo').first_or_create
model = make.models.where(value: '147').first_or_create
trim = model.trims.where(value: '1.6 TS 3d (2001 - 2005)').first_or_create
values = [
 {value: '2001 (X)'},
 {value: '2001 (Y)'},
 {value: '2001 (51)'},
 {value: '2002 (51)'},
 {value: '2002 (02)'},
 {value: '2002 (52)'},
 {value: '2003 (52)'},
 {value: '2003 (03)'},
 {value: '2003 (53)'},
 {value: '2004 (53)'},
 {value: '2004 (04)'},
 {value: '2004 (54)'},
 {value: '2005 (54)'},
 {value: '2005 (05)'}
]
values.each do |item|
  trim.model_years.where(item).first_or_create
end
我期望从这段代码中,它能够创建或定位make、model和trim,然后将适当的车型年份与trim关联起来

然而,正在发生的事情是,正在创建重复的车型年款-而不是将修剪与“2001(X)”相关联,例如,它正在创建一个值为“2001(X)”的新记录-很明显,它的行为就像我在使用create,而不是first_或_create

有人能告诉我为什么会发生这种情况,并帮助我纠正它吗

编辑:为了避免混淆,我已经调整了上面的代码以反映我当前的代码,没有第一个答案中提到的“查找”或“创建”问题。上面的代码仍在创建副本

编辑2:我意识到我的代码可能从根本上出了问题-我试图做的是在修剪和车型年之间创建关联(设置为多对多关系)。因此,可能我的错误在于我正在创建记录,而实际上我只想找到一个现有记录并添加一个关联

因此,我应该使用一个声明关联而不创建新对象的语句,而不是first\u或\u create

因此,我已将我的声明修改为以下内容,该声明正在发挥作用:

trim.model_years << ModelYear.where(item).first_or_create

trim.model_years此处有一些更正:

make = Make.find_or_create_by_value('Alfa Romeo')
model = make.models.find_or_create_by_value('147')
trim = model.trims.find_or_create_by_value('2.0 Lusso 5d (2001 - 2005)')
values = [
 {value: '2001 (X)'},
 {value: '2001 (Y)'},
 {value: '2001 (51)'},
 {value: '2002 (51)'},
 {value: '2002 (02)'},
 {value: '2002 (52)'},
 {value: '2003 (52)'},
 {value: '2003 (03)'},
 {value: '2003 (53)'},
 {value: '2004 (53)'},
 {value: '2004 (04)'},
 {value: '2004 (54)'},
 {value: '2005 (54)'},
 {value: '2005 (05)'}
]
values.each do |item|
  trim.model_years.where(item).first_or_create
end

如果按值使用
\u,ActiveRecord需要一个。。。价值不是散列:)

感谢您的更新-不过有趣的是,问题在于模型的年值(由底部使用first或create的循环创建)。。。其他问题会产生连锁反应吗?如果你每次都创建一个新的修剪,而不是找到它,那么你会重新创建所有的model_年,因为它是一个不同的修剪。你再试了吗?还做复制品吗?是的,只是再试一次,我仍然得到复制品。我已经将问题中的代码更新为我的新代码,避免使用任何find\u或create\u by语句,以避免混淆。奇怪的是,也许可以试试这个<代码>ModelYear.where(item.merge({trim\u id:trim.id}))
。另外,每次尝试记录tirm id,这样您就可以再次检查,这不是因为您有重复的trimsIt,而是因为我认为使用此代码的总体方法可能是错误的;它本质上是在寻找已经存在于内饰上的车型年,由于没有,它总是在添加新的车型年,而不仅仅是与具有相同值的现有车型年的关联。请注意,我没有在Make、model或trim上获得任何重复的车型年;唯一的复制品是车型年款。