ActiveRecord会获取具有一组特定的相关模型的所有模型(AND或OR)

时间:2020-01-04 14:49:04

标签: ruby-on-rails ruby activerecord ruby-on-rails-6

我有一个汽车数据库,这些汽车具有特定的功能(例如座椅加热,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') }

任何对此的帮助将不胜感激!

1 个答案:

答案 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) 
}