1

我在 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 的问题。

如何修改它以满足我的要求?

谢谢。

4

1 回答 1

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")
}

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

于 2013-02-05T02:14:15.180 回答