【发布时间】: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(*) >= ?', 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(*) >= ?", [1,2,3].length)。 -
但是这是如何工作的?假设一个公寓的设施是[1,2,4,5],那么我也认为它会显示在结果中,但它不应该。
标签: sql ruby-on-rails postgresql activerecord