Ruby on rails 与WHERE on Join子句的即时加载活动记录关联

Ruby on rails 与WHERE on Join子句的即时加载活动记录关联,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我想执行一个即时加载,但在即时加载查询上有一个where子句 假设我们有以下几点: class Features < ActiveRecord::Base has_many :feature_overrides end class FeatureOverride < ActiveRecord::Base belongs_to :feature end 通过此查询,我仍然必须搜索功能覆盖,以查看给定用户是否存在功能覆盖。将where添加到渴望的负载并不能满足我的需求: Fe

我想执行一个即时加载,但在即时加载查询上有一个where子句

假设我们有以下几点:

class Features < ActiveRecord::Base
  has_many :feature_overrides
end

class FeatureOverride < ActiveRecord::Base
  belongs_to :feature
end
通过此查询,我仍然必须搜索功能覆盖,以查看给定用户是否存在功能覆盖。将where添加到渴望的负载并不能满足我的需求:

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` = ?

听起来你需要左外连接(正是你在问题中写的,但我的大脑是盲目的)。如果您在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
范围中。如果您需要被用户覆盖的功能,您可以这样做:
功能覆盖。where(用户名:用户名)。包括(:功能)
。谢谢您的回答!实际上,我正在对这些特性做更多的工作,我想我可以通过FeatureOverride.where(username:username).includes(:feature).features从查询中获得它们,但我的情况比这要复杂一点……明白了,另一种方法是使用
连接
ActiveRecord方法。可能,您可以这样做:
Feature.Join(:Feature\u-overrides)。其中('Feature\u-overrides.username=?',username)
。这实际上仍然会通过内部联接减少结果:(
Feature.joins(%[LEFT OUTER JOIN 'feature_overrides' ON 'feature_overrides'.'feature_id' = 'features'.'id'])