在rails中具有两个关联的范围

时间:2013-02-04 23:02:00

标签: sql ruby-on-rails scope associations rails-activerecord

我在Rails中有以下范围。

scope :with_active_services, Contact.joins(:i_services, :c_services).merge(IService.enabled).merge(CService.enabled)

我正在尝试实现的是选择已启用i_services或c_services的联系人。联系人没有必要。

我遇到了一些我无法理解的问题。

此时范围的方式将意味着联系人需要同时返回已启用的i_service和c_service。

当我接受生成的SQL并将WHERE条件中的AND更改为OR时,我遇到了联系人仍然需要同时返回c_service和i_service的问题。

如何修改此符合我的要求?

感谢。

1 个答案:

答案 0 :(得分:0)

你可以通过一些花哨的SQL来做到这一点。像这样:

scope :with_active_services ->() {
  joins("LEFT JOIN i_services ON contact.id = i_services.contact_id AND i_services.enabled")
  .joins("LEFT JOIN c_services ON contact.id = c_services.contact_id AND c_services.enabled")
  .group(:id)
  .where("(count(i_services.id) + count(c_services.id)) > 0")
}

这将排除任何未加入任何已启用服务的联系人。