【问题标题】:Active Record query to find records that match all conditions in Rails has_many through relationshipActive Record 查询通过关系查找匹配 Rails has_many 中所有条件的记录
【发布时间】:2016-11-15 01:50:45
【问题描述】:

我有两个模型,即公寓和设施,它们通过 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])

但这不是我想要的。

【问题讨论】:

  • 要获得独特的价值,您必须应用 uniq。也许试试这个? stackoverflow.com/questions/18015859/…
  • @NinjaBoy 我试过了。这不是我想要的,因为它仍然给我提供了具有一种便利设施但没有另一种便利设施的公寓。我只需要提供所有便利设施 ID 的公寓
  • 尝试在行尾添加.having('COUNT(*) &gt;= ?', amenity_ids_array.length)。您需要设置amenity_ids_array = [1,2,3]。如果由于某种原因您可以在 ApartmentAmenty 模型中找到重复项,那么您需要添加一个 distinct 子句以避免将相同的 Apartment-Amenity 关系计算两次。编辑:您需要在使用 having 之前对结果进行分组。
  • 试试Apartment.joins(:apartment_amenities).group('apartments.id').where('apartment_amenities.amenity_id IN (?)', [1,2,3]).having("COUNT(*) &gt;= ?", [1,2,3].length)
  • 但是这是如何工作的?假设一个公寓的设施是[1,2,4,5],那么我也认为它会显示在结果中,但它不应该。

标签: sql ruby-on-rails postgresql activerecord


【解决方案1】:

好吧,放弃了几天又回来了,终于找到了这个问题: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

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 2012-01-01
    • 2012-10-24
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多