ruby-on-rails - 我怎么知道 Rails 已经加载/缓存了一个 Activerecord 类属性?

标签 ruby-on-rails ruby caching activerecord

假设我有一个 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/

相关文章:

ruby-on-rails - 如何让 Heroku 识别子目录(不是 root)中的 yarn.lock 或 package.json

mysql - 无法使用 mysql2 gem 显示我的 View 中的值

Ruby/Gmail gem 来抓取已发送消息

forms - Firefox 在重新加载时保留表单数据

caching - 如何设置 nginx 缓存头永不过期?

ruby-on-rails - rails : How can I access the parent model of a new record's nested associations?

ruby-on-rails - 如何使用带有 ruby​​ 的 Mechanize 循环创建日志文件

ruby-on-rails - 如何通过 GMAIL API 发送带有 BCC header 的电子邮件?

c# - 有没有理由我不应该从 C# 开始

jquery - 为什么在获取 304 状态码时,jquery ajax 不调用从缓存中填充数据变量?