我想执行急切的加载,但在急切加载查询中有一个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` = ?
答案 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
范围。