ruby-on-rails - find_or_create by,如果找到,它会更新吗?
问题描述
https://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by
阅读文档后,它确实说:“找到第一个名为“Penélope”的用户或创建一个新用户。” 和“我们已经有一个,所以现有的记录将被返回。”
但我确实想 100% 清楚这一点。
如果我做:
User.find_or_create_by(first_name: 'Scarlett') do |user|
user.last_name = 'Johansson'
end
和用户确实存在first_name: 'Scarlett'
和`last_name:'Johansson'``,它会更新它还是完全忽略它?
就我而言,如果它完全存在,我想完全忽略它,并想知道是否find_or_create
可行。因为我不想费心用相同的信息更新记录。我也不想退回任何东西。
我应该使用find_or_create
还是只使用exists?
另外,如果find_or_create
确实可以作为检查它是否存在的一种方式,并且如果存在则会忽略,我可以这样使用它吗?
例如:
User.find_or_create_by(first_name: 'Scarlett') do |user|
user.last_name = 'Johansson'
puts "Hello" #if it doesn't exist
end
如果它不存在,“Hello”会放吗?如果存在,它不会放?
解决方案
在示例中,如果您有一条或多User
条名为“Scarlett”的记录,find_or_create_by
则将返回其中一条记录(使用 LIMIT 1 查询)。您提供的代码将设置(但不保存)last_name
该记录的“Johansson”。
如果您没有一个或多个名字为“Scarlett”的记录,则将创建一条记录并且该字段first_name
的值为“Scarlett”。同样,该last_name
字段将设置为“Johansson”,但不会保存(在您提供的代码中;您可以将其保存在其他地方)。
在这段代码中:
User.find_or_create_by(first_name: 'Scarlett') do |user|
user.last_name = 'Johansson'
puts "Hello" #if it doesn't exist
end
...您将始终看到“Hello”,因为find_or_create_by
将始终返回一条记录(找到的或创建的)。
推荐阅读
- javascript - 按 ID 删除选项卡时出错(chrome 扩展)
- css - React 和 flexbox 的问题
- c# - prevent.Default() 在 Asp.Net Core 3.0.0 Preview-7 中给出编译错误
- excel - 获取工作簿中所有子的名称
- javascript - 如果根据复选框值选中或取消选中复选框,则下拉列表的值
- html - 为什么悬停颜色不填充
- java - Maven:如何处理包含模块的模块?
- java - 如何从线程转储报告中找到卡住线程的根本原因?
- rest-assured-jsonpath - 有效的 JSONPath 在 RestAssured JsonPath 中抛出 EOF
- excel - 如何使用 vba 从文本文件中提取特定的数据行