Rails - find_or_create_by给出了意想不到的结果

时间:2012-07-31 15:44:53

标签: ruby-on-rails ruby-on-rails-3 activerecord

我正在播种我的数据库,下面的部分给了我一些我没想到的结果:


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似乎总是创建重复的。

1 个答案:

答案 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)

所以,是的,会有重复的值,但所有行都是唯一的。如果这不是您想要的,您必须重新构建数据库。