gpt4 book ai didi

ruby-on-rails - 在 ActiveRecord 中使用 first_or_create 的两种不同方式的区别

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:22 31 4
gpt4 key购买 nike

我是 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
}

最佳答案

其实有两种方法:find_or_create_by,添加一个列,给一组属性。

所以,例如你可以这样写:

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

第二个是 first_or_create,它按照您的建议工作(您的第二个解决方案)(另请参阅 documentation)。

有人建议引入 find_or_create 方法,该方法接受哈希,但结果是 first_or_create。 (请参阅此处的 discussion)。

请注意,这两者在 relevant rails guide 中也有很好的解释。 .

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

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

这将尝试按名称查找组织,如果找不到,则使用该 block 创建组织。注意:只有在组织不存在的情况下才会执行该 block !

关于ruby-on-rails - 在 ActiveRecord 中使用 first_or_create 的两种不同方式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14923505/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com