Rails忽略默认范围的顺序和限制条件包括

时间:2015-12-01 18:25:39

标签: ruby-on-rails activerecord scope

我面临一个关于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范围内应用limitdefault条件。 (但如果它有一个where条件,则应用它)

A.includes(:bar).references(:bar).first.bars.size
=> 20

OR

A.eager_load(:bar).first.bars.size
=> 20

如何避免这种情况。注意:我知道我可以使用连接并避免使用子查询,但我非常希望通过使用最少的查询加急加载并能够通过AR对象进行访问。

欢迎任何建议。

1 个答案:

答案 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