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

Yan*_*dri 2 activerecord ruby-on-rails

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

Boo*_*age 6

不,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
Run Code Online (Sandbox Code Playgroud)

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

此方法在任何时候都不会访问数据库。

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

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

Run Code Online (Sandbox Code Playgroud)