Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于查找与Rails中的所有条件匹配的记录的活动记录查询具有许多贯穿关系_Sql_Ruby On Rails_Postgresql_Activerecord - Fatal编程技术网

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