3

我对 ActiveRecord 完全陌生,所以这可能是一个愚蠢的问题:我写的方法是这样的:

sample_organizations = [ '37 Signals', 'Fog Creek'] 
sample_organizations.each { |item|
    Organization.first_or_create(
        name: item,
        time_zone: 'Central'
    )
  }

它没有用,我希望它会遍历我的组织数组并将它们全部插入数据库,但它只是插入了第一行。

然后有人建议像这样改变它并且这个工作,但我想知道是否有人可以解释第一种方法中的错误,以便我可以了解我在做什么/假设错误。

所以这个工作:

   sample_organizations = [ '37 Signals', 'Fog Creek'] 
    sample_organizations.each { |item|
    Organization.where(name: item).where(time_zone: 'Central').first_or_create
      }
4

2 回答 2

5

实际上,有两种方法:find_or_create_by添加一列并赋予一组属性。

因此,例如,您可以编写:

find_or_create_by_name('Willy', time_zone: 'UTC')

第二个是first_or_create, 并且按照您的建议工作(您的第二个解决方案)(也请参阅文档)。

有人建议引入该find_or_create方法,该方法接受哈希,但结果是first_or_create. (见这里的讨论)。

请注意,两者在相关的导轨指南中也得到了很好的解释。

[更新 2014-06-30] 请注意,当前符号已更改,我们现在应该写

Organization.find_or_create_by(name: '37 signals') do |organisation|
  organisation.time_zone = 'Central'
end

它将尝试按名称查找组织,如果找不到,则使用块创建组织。注意:该块仅在组织不存在时执行!

于 2013-02-17T17:58:13.333 回答
4

它应该如下所示:

sample_organizations.each { |item|
  Organization.find_or_create_by_name(item, time_zone: 'Central')
}
于 2013-02-17T16:56:03.940 回答