我有以下的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,它们也应该被排除)。
我怎样才能完成这个任务?
如果你从一个给定的 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
)