我正在播种我的数据库,下面的部分给了我一些我没想到的结果:
trim.model_years.find_or_create_by_value([
{value: '2009 (58)'},
{value: '2009 (09)'},
{value: '2009 (59)'},
{value: '2010 (59)'},
{value: '2010 (10)'},
{value: '2010 (60)'},
{value: '2011 (60)'},
{value: '2011 (11)'},
{value: '2011 (61)'},
])
我原本希望这个可以单独处理每一个,并为记录做一个find_or_create(我从普通的create方法中调整格式,只需创建9个单独的记录)。
然而,似乎正在发生的事情是我得到1条记录,这是一个包含所有记录的字符串,包括“value:”等。
如何格式化以允许将9个单独的记录设为find_or_created?
编辑:非常感谢关于遍历数组的答案 - 我现在似乎已经到了某个地方,但仍然有一个问题,即不是创建一个记录和其他关联,种子文件仍在创建每个循环中重复的记录。我在下面添加了修改后的代码:
make = Make.find_or_create_by_value(value: 'Alfa Romeo')
model = make.models.find_or_create_by_value(value: '147')
trim = model.trims.find_or_create_by_value(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
当然,有很多像这样的块,所有这些块都应该重复使用相同的模型年,但是first_or_create似乎总是创建重复的。
答案 0 :(得分:2)
迭代你的数组:
values = [
{value: '2009 (58)'},
{value: '2009 (09)'},
{value: '2009 (59)'},
{value: '2010 (59)'},
{value: '2010 (10)'},
{value: '2010 (60)'},
{value: '2011 (60)'},
{value: '2011 (11)'},
{value: '2011 (61)'},
]
values.each do |item|
trim.model_years.find_or_create_by_value(item[:value])
end
顺便说一句,Rails指南建议使用first_or_create
而不是find_or_create_by
。使用first_or_create
,您的代码可能如下所示:
values.each do |item|
trim.model_years.where(item).first_or_create
end
抱歉,但我不明白你的新问题。这不应该创建重复的记录。它应该为每个模型创建模型年份。像这样:
id | model_id | value
=========================
1 | 1 | 2001 (X)
2 | 1 | 2001 (Y)
3 | 1 | 2001 (51)
4 | 1 | 2002 (51)
5 | 1 | 2002 (52)
6 | 2 | 2001 (X)
7 | 2 | 2001 (Y)
8 | 2 | 2001 (51)
所以,是的,会有重复的值,但所有行都是唯一的。如果这不是您想要的,您必须重新构建数据库。