class Customer
scope :active_whole_year, -> { joins(:subscription => :subscription_type).merge(Subscription.active_whole_year) }
end
class Subscription
scope :active_whole_year, -> { joins(:subscription_type).merge(SubscriptionType.whole_year) }
end
class SubscriptionType
scope :whole_year, -> { where(:name => WHOLE_YEAR) }
end
调用Customer.active_whole_year会出现以下错误:
Association named 'subscription_type' was not found; perhaps you misspelled it?
..出于某种原因。
我可以通过从Customer.active_whole_year
范围中删除联接条件来使Subscription.active_whole_year
工作。但是,直接调用Subscription.active_whole_year
将不起作用,因为它依赖于以下合并的条件。
我知道我可以通过简单地将范围Customer.active_whole_year
变成一个巨大的直接查询来解决这个问题。问题是,我希望范围单独工作,但也能够嵌套它们,就像我想在这里做的那样。这是为了区分问题,并保持代码DRY。
那么如何正确嵌套连接和合并,以便Customer.active_whole_year
使用Subscription.active_whole_year
并且后者也可以独立调用?
这在Rails中是否可以以优雅的方式实现?
答案 0 :(得分:0)
我发现这是Rails在合并嵌套查询时不保留连接上下文的问题:
https://github.com/rails/rails/issues/3002 https://github.com/rails/rails/pull/5494#issuecomment-5530297
相关问题: ActiveRelation that requires nested joins using scopes
在Rails提交中显然已修复:
https://github.com/rails/rails/commit/dc764fcc
似乎解决方案是升级到Rails 4.0.2。太糟糕了我因为active_admin而被迫使用Rails 3 ......