如何确定钢轨协会是否急于加载?

有没有人知道一种方式来确定如果一个Rails协会已经急于加载?

我的情况:我有一个结果集有时其中一个协会是渴望加载,有时不是。 如果不是急切加载,那么我想用ActiveRecord的查找来查找关联。 如果是急于加载,我想使用检测。

例如,假设我在项目模型中有一个“has_many”的shipping_info对象数组。 然后:

如果item急切加载,最有效的加载是:

item.shipping_infos.detect { |si| si.region == "United States" } 

如果item不是急于加载,则最有效的加载是:

 item.shipping_infos.where(region: "United States").first 

但是,除非我知道是否急于加载,否则我不知道要调用哪个代码来有效地获取logging。 如果我不使用第一种方法,那么我不得不查找更多的数据库logging。 如果我在使用第二种方法的时候,我的加载的对象被忽略。

item.shipping_infos.loaded? 会告诉你。

我得说,但是:这个path导致疯狂…在编写testingloaded?代码之前loaded?#detect#find之间#detect决定,确保这个实例真的很重要,相对于其他一切正在发生的事情。

如果这不是您的应用程序最慢的事情,那么添加额外的代码path会增加不必要的复杂性。 仅仅因为你可能浪费了一点数据库的努力并不意味着你需要修复它 – 这可能不会以任何可测量的方式。

loaded_foo? 从Rails 3.1开始已经被弃用了。 请参阅: https : //github.com/rails/rails/issues/472使用association(name).loaded? 代替。

我build议使用item.association_cache.keys,它将提供预先加载的关联列表。 所以你item.association_cache.keys.include? :name_of_association

你可以检测一个关联是否已经加载了loaded_foo? 例如,如果shipping_info是一个belongs_to关联,那么item.loaded_shipping_info? 当它被加载时会返回true。 奇怪的是,当它没有被加载时,它似乎返回零(而不是错误)(无论如何,Rails 2.3.10)。

解决这个问题应该是foo.association(:bla).loaded? ,但它工作不正确 – 它检查并标记关联为脏:

 class Foo; has_one :bla, :autosave => true end foo.association(:bla).loaded? #=> false foo.save # saves foo and fires select * from bla 

所以我添加了以下扩展到ActiveRecord:

 module ActiveRecord class Base def association_loaded?(name) association_instance_get(name).present? end end end 

现在:

 class Foo; has_one :bla, :autosave => true end foo.association_loaded?(:bla) #=> false foo.save # saves foo 

看看子弹gem。 。 这将告诉你什么时候你应该和不应该使用急切的加载。