Rails - first_or_create添加重复记录?

时间:2012-07-31 19:12:46

标签: 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: '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

我期望从这段代码中创建或定位品牌,模型和裁剪,然后将相应的模型年与裁剪相关联。

然而,正在发生的事情是,正在创建重复的模型年 - 而不是将修剪与'2001(X)'相关联,例如,它正在创建一个值为'2001(X)'的新记录 - 要清楚,它表现得好像我在使用create,而不是first_or_create。

有谁能说明为什么会这样,并帮我纠正它?

编辑:为避免混淆,我调整了上面的代码以反映我当前的代码,没有第一个答案中引用的find_or_create_by问题。上面的代码仍在创建重复项。

编辑2:我发现我的代码可能从根本上出错 - 我要做的是在trim和model_year之间创建一个关联(它设置为多个 - 很多关系)。因此,也许我出错的地方是我正在创建记录,而实际上我只想找到现有记录并添加关联。

因此,我应该使用一个声明关联而不创建新对象的语句,而不是first_or_create。

我已将我的陈述修改为以下内容,该陈述正在起作用:

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

感谢大家的帮助!

1 个答案:

答案 0 :(得分:3)

这里有一些更正:

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

如果您使用_by_value,ActiveRecord需要...值!不是哈希:)

相关问题