渴望在加入条款

时间:2017-02-21 16:39:04

标签: ruby-on-rails activerecord

我想执行急切的加载,但在急切加载查询中有一个where子句。

我们说我们有以下内容:

class Features < ActiveRecord::Base
  has_many :feature_overrides
end

class FeatureOverride < ActiveRecord::Base
  belongs_to :feature
end

如果某个要素具有active属性,则可以通过要素覆盖覆盖该属性。

为用户添加了功能覆盖,因此功能的active属性可以被特定用户的功能覆盖覆盖。

以下是我必须获取所有功能并急切加载feature_overrides的查询:

Features.all.includes(:feature_overrides)

使用此查询,我仍然需要搜索feature_overrides以查看是否存在给定用户的功能覆盖。添加热切负载的位置并不能满足我的需求:

Features.all.includes(:feature_overrides).where('feature_overrides.username = ?', username)

这会将我的结果简化为仅包含username覆盖的功能。

此时我认为我想要做的是左外连接,但是当我尝试该活动记录时不会反序列化功能覆盖关联。

我喜欢以某种方式执行查询的热切负载:

SELECT `features`.* FROM `features`
SELECT `feature_overrides`.* FROM `feature_overrides` WHERE `feature_overrides`.`feature_id` IN (...) AND `feature_overrides`.`username` = ?

1 个答案:

答案 0 :(得分:0)

这听起来像是你需要左外连接(正是你在问题中所写的,但我的思绪是盲目的)。如果您使用 Rails 5 尝试使用此功能:

Feature.left_outer_joins(:feature_overrides)

如果您使用 Rails 4 ,则需要手动编写此内容:

Feature.joins(%[LEFT OUTER JOIN 'feature_overrides' ON 'feature_overrides'.'feature_id' = 'features'.'id'])

如果您需要where过滤feature_overrides,还可以附加username范围。