【问题标题】:How do I know Rails has loaded/cached an Activerecord class attributes?我怎么知道 Rails 已经加载/缓存了 Activerecord 类属性?
【发布时间】:2017-04-17 14:16:09
【问题描述】:

假设我有一个 ActiveRecord 类“用户”。

我意识到当我第一次通过 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 来操作它但不保存它。

【问题讨论】:

    标签: ruby-on-rails ruby caching activerecord


    【解决方案1】:

    是和不是。实际的模式缓存可以在ActiveRecord::Base.connection.schema_cache 下找到,但是调用connection 的行为会导致它被打开。如果ActiveRecord::Base.connected? 如果为假,则可以假设没有架构缓存,如果为真,则必须检查schema_cache 实例的@columns ivar。

    这是 hacky,因为 Active Record 模式假定对象连接到数据源。如果您需要独立于数据库的域对象,我建议您使用Virtus + ActiveModel::Validationdry-struct 等将它们编写为 PORO。

    【讨论】:

      猜你喜欢
      • 2012-12-10
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多