我有一个汽车数据库,这些汽车具有特定的功能(例如座椅加热,LED灯,交流电等)。
模型设置如下:
class Car < ApplicationRecord
has_many :car_key_features
has_many :key_features, through: :car_key_features
end
class CarKeyFeature < ApplicationRecord
belongs_to :car
belongs_to :key_feature
end
class KeyFeature < ApplicationRecord
has_many :car_key_features
has_many :cars, through: :car_key_features
end
我现在想获得所有具有特定功能的汽车。例如,我想获得所有具有标识符“ seat-heating”和“ led-lights”的功能的汽车(但它也可以具有其他功能)。
我在以下查询中尝试了此方法,但这使我得到了具有至少一个功能的所有汽车,而不是全部(因为这会导致SQL“ IN”查询):
scope :by_key_features, ->(identifiers) { joins(:key_features).where(key_features: { identifier: identifiers }).group('cars.id') }
任何对此的帮助将不胜感激!
答案 0 :(得分:3)
您的查询将选择具有至少一项匹配功能的所有汽车。因此,您只需要选择具有与查询中相同的所有功能的汽车即可。
scope :by_key_features, ->(identifiers) {
joins(:key_features)
.where(key_features: { identifier: identifiers })
.group('cars.id')
.having('COUNT(key_features.id) >= ?', identifiers.size)
}