Sql 用于查找与Rails中的所有条件匹配的记录的活动记录查询具有许多贯穿关系
我有两个模型,公寓和设施,它们通过公寓设施联系在一起。我正在尝试实现一个过滤器,其中我只显示具有所有指定设施的公寓Sql 用于查找与Rails中的所有条件匹配的记录的活动记录查询具有许多贯穿关系,sql,ruby-on-rails,postgresql,activerecord,Sql,Ruby On Rails,Postgresql,Activerecord,我有两个模型,公寓和设施,它们通过公寓设施联系在一起。我正在尝试实现一个过滤器,其中我只显示具有所有指定设施的公寓 class Amenity < ActiveRecord::Base has_many :apartment_amenities has_many :apartments, through: :apartment_amenities end class ApartmentAmenity < ActiveRecord::Base belongs_to :
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
但这不是我想要的 好吧,在放弃几天之后,我终于找到了这个问题: 这让我找到了正确的答案:
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
要获得不同的值,必须应用uniq。也许试试这个@我试过了。这不完全是我想要的,因为它仍然给我提供一种舒适而不是另一种舒适的公寓。我只需要拥有所有便利设施ID的公寓,giventry将
。在您的线路末端添加('COUNT(*)>=?',便利设施ID\u array.length)
。您需要设置舒适度\u id\u数组=[1,2,3]
。如果出于某种原因,您可以在Apartmenty
模型中找到重复项,那么您需要添加distinct
子句,以避免将同一公寓设施关系计算两次。编辑:在使用having
之前,您需要对结果进行分组。尝试一下公寓连接(:公寓设施).group('partments.id')。何处('partments\u设施.amency\u id IN(?)[1,2,3])。having('COUNT(*)>=?,[1,2,3].length)
这是如何工作的?比如说,一套公寓的相似性是[1,2,4,5],那么我也认为,它会在结果中显示出来,但它不应该。
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