我面临一个关于Default Scoping和Eager Loading的奇怪问题。
考虑以下结构
class Foo < ActiveRecord::Base
has_many :bars
end
class Bar < ActiveRecord::Base
belongs_to :foo
default_scope -> {order(:foo_column1).limit(1)}
end
鉴于这种简单的关联并假设每个Foo有20个柱,我正在进行以下查询。
当我直接引用bars
关联时,默认范围正在快速应用,而我在结果中只获得1 bar,因为我在默认范围内限制/排序。
A.first.bars.size
=> 1
然而,当我急切加载并尝试获取条形对象时,它会带来所有条形图。这不会在order
范围内应用limit
和default
条件。 (但如果它有一个where
条件,则应用它)
A.includes(:bar).references(:bar).first.bars.size
=> 20
OR
A.eager_load(:bar).first.bars.size
=> 20
如何避免这种情况。注意:我知道我可以使用连接并避免使用子查询,但我非常希望通过使用最少的查询加急加载并能够通过AR对象进行访问。
欢迎任何建议。
答案 0 :(得分:0)
我建议使用显式范围而不是默认范围。
scope :one_bar, -> { bars.order(:foo_column1).limit(1) }
然后尝试
Foo.eager_load(:bars).first.one_bar
另外,你甚至可以尝试:
scope :first_bar, -> { bars.order(:foo_column1).first }
然后这不是关系,而是所需的Bar
对象:
Foo.eager_load(:bars).first.first_bar