RAILS: ActiveRecord#persisted 吗?实际查询数据库?

RAILS: Does ActiveRecord#persisted? actually queries the database?

根据文档,我知道它会检查对象是 new_record 还是 is_destroyed,但它是否仅基于对象的当前状态(例如已设置 id 或总体上不是 nil)来执行此操作?或者它是否尝试执行查询以查看是否找到任何匹配项?

否,persisted?不查询数据库。它仅检查对象的 @destroyed@new_record 变量的值。

https://github.com/rails/rails/blob/6-1-stable/activerecord/lib/active_record/persistence.rb#L444

# Returns true if the record is persisted, i.e. it's not a new record and it was
# not destroyed, otherwise returns false.
def persisted?
  !(@new_record || @destroyed)
end

@new_record在实例化对象时设置为true,然后在创建记录后设置为false。否则为零。 @destroyed对象销毁后设置为true,否则为nil.

此方法绝不会访问数据库。

如果那是您的目标,您可以使用 exists? 使用 ID 查询数据库:

> User.exists?(user.id)
  User Exists? (5.5ms)  SELECT 1 AS one FROM "users" WHERE "users"."id" =  LIMIT   [["id", "123"], ["LIMIT", 1]]
=> true
> User.exists?('321')
  User Exists? (0.4ms)  SELECT 1 AS one FROM "users" WHERE "users"."id" =  LIMIT   [["id", nil], ["LIMIT", 1]]
=> false