我的 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
谢谢大家的帮助!