sql - Active Record查询通过关系在Rails has_many中查找符合所有条件的记录

标签 sql ruby-on-rails postgresql activerecord

我有两个模型,Apartments 和 Amenities,它们通过 ApartmentAmenities 关联。我正在尝试实现一个过滤器,只显示具有所有指定便利设施的公寓。

class Amenity < ActiveRecord::Base  
  has_many :apartment_amenities
  has_many :apartments, through: :apartment_amenities
end

class ApartmentAmenity < ActiveRecord::Base
  belongs_to :apartment
  belongs_to :amenity
end

class Apartment < ActiveRecord::Base
  has_many :apartment_amenities
  has_many :amenities, through: :apartment_amenities
end

我有一个正在运行的查询,它将返回至少匹配给定集合中的一项便利设施的所有公寓,如下所示:

Apartment.joins(:apartment_amenities).where('apartment_amenities.amenity_id IN (?)', [1,2,3])

但这不是我想要的。

最佳答案

好吧,放弃了几天又重新开始,我终于找到了这个问题:How to find records, whose has_many through objects include all objects of some list?

这让我得到了正确的答案:

  def self.with_amenities(amenity_ids)
    where("NOT EXISTS (SELECT * FROM amenities
      WHERE NOT EXISTS (SELECT * FROM apartment_amenities
        WHERE apartment_amenities.amenity_id = amenities.id
        AND apartment_amenities.apartment_id = apartments.id)
      AND amenities.id IN (?))", amenity_ids)
  end

关于sql - Active Record查询通过关系在Rails has_many中查找符合所有条件的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40308942/

相关文章:

mysql - 何时在 MySQL 中使用单引号、双引号和反引号

ruby-on-rails - 具有多种生产设置的 Ruby on Rails

c# - 如何使用 Npgsql 和 PostgreSQL 执行 ExecuteScalar 函数?

sql - 加入 2 个 postgres sql 查询

sql - 特定行数占总数的百分比计算

MySQL JOIN 与 SUBQUERY 非常慢

sql - 处理 SQL 数据问题的最佳方法

用于选择我的第一列中常见的记录的 SQL 查询

ruby-on-rails - 如何更改 f.has_many 中的标题和名称按钮? rails 上的 active_admin

ruby-on-rails - 为什么在 Rails 引擎中明确要求应用程序 Controller ?