ruby-on-rails - 如何在 Ruby on Rails 中使用 ActiveRecord 找到与完全相同的 has_many 关系集的关系?
问题描述
我有以下活动记录模型:
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
then 集合开始:
以下应该工作
找出House
满足以下条件的 s:
House
s 不在具有除提供的功能之外的功能的房屋列表中- 特征的
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
)
推荐阅读
- multithreading - Flask 与 PyQt5 - Flask 控制程序流程?
- django - 如何为身份验证创建自定义 django 验证
- python - Prometheus pushgateway 简单的指标监视器
- python - C python扩展中的分段错误
- java - 链表的选择排序
- linux - 尝试查找某些文件时 find 不给我输出
- javascript - 为什么我的石头剪刀布游戏无法运行?它不断返回“你选择了摇滚,你赢了”,我该如何解决这个问题?
- javascript - Angular 创建具有动态属性的模型
- python - 如何引用一个类列表项?
- node.js - 您可以从非 websocket lambda 向 websocket 客户端发送消息吗?