如何在Ruby on Rails中使用ActiveRecord找到具有完全相同的has_many关系集的关系?

问题描述 投票:0回答:2

我有以下的Active Record模型。

class House < ActiveRecord::Base
  has_many :features
end

class Feature < ActiveRecord::Base
  has_many :houses
end

我如何写一个查询来返回所有具有完全相同的多对多关系集的房子?因此,如果一个房子有特征1,2,3,我希望它们完全相同,同时排除。

只有一个特征子集的房子(例如,1 & 2)具有该集合但包括其他特征的房子(因此,如果它们具有特征1,2,3 & 4,它们也应该被排除)。

我怎样才能完成这个任务?

ruby-on-rails many-to-many rails-activerecord
2个回答
2
投票

如果你从一个给定的 House 或给定的 Features 那么。

以下内容应该可行

找到 House符合下列标准的:

  • House的房屋清单中不包括除所提供的特征外的其他特征。
  • House的总特征数等于提供的特征数。
features = [1,2,3]
House.where(
  id: House.select(:id)
           .joins(:features)
           .where.not(
             id: House.select(:id)
                      .joins(:features)
                      .where.not(features: {id: features})
           )
           .group(:id)
           .having(Feature.arel_attribute(:id).count.eq(features.size))
)

类似于这样的SQL。(假设你的连接表命名为 houses_features)

SELECT 
  houses.*
FROM
  houses
WHERE 
  houses.id IN ( 
     SELECT 
       houses.id 
     FROM 
       houses
       INNER JOIN houses_features ON houses.id = houses_features.house_id
       INNER JOIN features ON features.id = houses_features.feature_id
     WHERE 
       houses.id NOT IN (
         SELECT 
           houses.id 
         FROM 
           houses 
           INNER JOIN houses_features ON houses.id = houses_features.house_id
           INNER JOIN features ON features.id = houses_features.feature_id 
         WHERE 
           features.id NOT IN (1,2,3)
      )
    GROUP BY 
      houses.id
    HAVING
     COUNT(features.id) = 3
  )
© www.soinside.com 2019 - 2024. All rights reserved.