如何在Rails中正确嵌套与合并的连接?

时间:2013-12-06 17:26:44

标签: ruby-on-rails join nested-queries

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中是否可以以优雅的方式实现?

1 个答案:

答案 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 ......