【问题标题】:Eager load scoped set of objects in rails急切加载范围内的轨道对象集
【发布时间】:2012-08-03 21:48:57
【问题描述】:

我有一个类似的问题,只是使用较新版本的 rails:

Ruby on Rails - Add condition on ':include =>' to load limited number of objects

我想预先加载关联,但要限定预先加载中包含的内容。这在rails 3.2中可能吗?我试过了

Foo.includes(:bar).where("bars.col = x")

但这仅限于Foo,其中至少有一个Bar,其中col = x,而我也想要那些没有BarFoo。我可以创建另一个关联,但随后我失去了发送参数的能力(看起来不像 :conditions 可以处理带参数的 lambda)。

【问题讨论】:

  • 我不完全确定,但我认为我的另一个问题可能更准确地说是您正在寻找的@user1158559:stackoverflow.com/questions/15691558/…。在了解了更多关于 Rails 的信息后,我问了这个问题。也没有答案
  • 你是对的。可能需要在那个上再吹 50 个代表!谢谢!
  • 我为我的另一个(IMO 更好)问题添加了赏金。

标签: ruby-on-rails-3


【解决方案1】:

尝试将所需的 Foo 包含在 next 的范围内

Foo.includes(:bar).where("bars.col = x OR bars.id IS NULL")

Foo.includes(:bar).where("bars.col = x AND bars.id IS NULL")

取决于您的需求

所以你可以动态地做,比如

#Foo class
def self.including_bars_equal_to(x) # or scope :including_bars_equal_to, :lambda{|x| ....}
   self.includes(:bar).where("bars.col = ? AND bars.id IS NULL", x)  
end

尝试2 也许你应该尝试自定义加入与包含一起

Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.col = 'x'").
includes(:bar)

或者您可以将连接与选择选择结合起来

  Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.col = 'x'").
  select("foos.*, bar.id as bar_id, bar.col as bar_col")

【讨论】:

  • 很好的答案,但不完全是。这将生成SELECT foos.*, bars.* FROM foos LEFT OUTER JOIN bars ON bars.foo_id = foos.id WHERE bars.col = x OR bars.id IS NULL,而我想要SELECT foos.*, bars.* FROM foos LEFT OUTER JOIN bars ON bars.foo_id = foos.id AND bars.col = x。不同之处在于您的查询不会返回foos 的行,其中barcol 不等于x,而我的查询将只有foos 存在的行。
  • 不,抱歉,您的答案仍然排除了 foos 行与一个或多个与条形行都具有 col x 相关联的行。您的结果中foos 的总数会有所不同。
  • 我会尝试将连接与包含而不是
  • 当您使用 SQL 指定连接时,ActiveRecord 在查找 foos 时应用连接,但随后使用 WHERE id IN (1,2,3,....) 查找 bars,没有额外条件。
  • @user1158559 ,是的,你是对的,但它使用了第一次查询结果中的 bars.ids
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 2021-07-19
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多