Ruby on rails 与WHERE on Join子句的即时加载活动记录关联
我想执行一个即时加载,但在即时加载查询上有一个where子句 假设我们有以下几点: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
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'])