我有一个汽车数据库,这些汽车具有特定的功能(如座椅加热,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
我现在想获得所有具有特定功能的汽车。例如,我想获取所有具有标识符为"座椅加热"和"LED 灯"功能的汽车(但它也可能具有其他功能(。
我尝试使用以下查询,但这给了我所有至少具有一项功能的汽车,而不是全部(因为它会导致 SQL"IN"查询(:
scope :by_key_features, ->(identifiers) { joins(:key_features).where(key_features: { identifier: identifiers }).group('cars.id') }
任何这方面的帮助将不胜感激!
您的查询将选择至少具有一个匹配要素的所有汽车。因此,您只需要选择与查询中具有相同数量的所有要素的汽车。
scope :by_key_features, ->(identifiers) {
joins(:key_features)
.where(key_features: { identifier: identifiers })
.group('cars.id')
.having('COUNT(key_features.id) >= ?', identifiers.size)
}