首页 > 解决方案 > 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”会放吗?如果存在,它不会放?

标签: ruby-on-rails

解决方案


在示例中,如果您有一条或多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将始终返回一条记录(找到的或创建的)。


推荐阅读