【问题标题】:Scope with two associations in rails范围与 Rails 中的两个关联
【发布时间】:2013-01-19 18:42:39
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 不幸的是,Rails 不支持任何查询方法的“OR”谓词。不过,您也许可以为此使用 ARel,例如查看 this answer。不确定是否可以使用现有的范围。

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


【解决方案1】:

您可以使用一些花哨的 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")
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2015-06-25
    • 2021-11-17
    相关资源
    最近更新 更多