假设我有一个 ActiveRecord 类“User”。
我意识到我第一次通过 User.new 使用它时,Rails 调用数据库以从 users 表中获取 User 的实际属性。随后它被缓存,并且不需要数据库调用。
这很好..而且在单线程中很简单。
假设我有多个线程在单个进程中运行。第一个调用 User.new 的线程(或任何涉及 User 的线程,例如查找用户)将在数据库中查找属性。后续的将缓存它们。
有没有办法检查 ActiveRecord 属性是否被缓存?
我不想在调用 User.new 时总是通过 ActiveRecord::Base.connection_pool.with_connection 检查数据库连接,当我不打算使用数据库连接时 - 是的,甚至不保存它.
u = nil
ActiveRecord::Base.connection_pool.with_connection do # I don't want to checkout a conn if User attributes are cached.
u = User.new
end
#manipulation of u. but u.save NEVER ever gets called.
我不会完全解释我的整个推理,但这样做会分散人们的注意力,因为一句话:它很复杂。如果有兴趣,这里有一篇文章与我的问题类似:https://bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid-leaked-connections/如果可能的话,我基本上不想检查数据库连接,但仍然想调用 User.new 来操作它但不保存它。
最佳答案
是也不是。实际的模式缓存可以在 ActiveRecord::Base.connection.schema_cache
下找到, 但调用 connection
的行为导致它被打开。如果ActiveRecord::Base.connected?
如果为 false,则可以假设没有模式缓存,如果为 true,则必须检查 @columns
你的伊娃schema_cache
实例。
这是 hacky,因为 Active Record 模式假定对象连接到数据源。如果您需要独立于您的数据库的域对象,我建议使用 Virtus 将它们编写为 PORO。 + ActiveModel::Validation
, 或 dry-struct等
关于ruby-on-rails - 我怎么知道 Rails 已经加载/缓存了一个 Activerecord 类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40936110/