我在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的问题。
如何修改此符合我的要求?
感谢。
答案 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")
}
这将排除任何未加入任何已启用服务的联系人。