给定的Car
有许多features
通过listed_features
连接。如何查找cars
与features
ids
和1
和2
的所有3
? cars
可以有更多features
,但他们必须拥有前三个features
。
设置:
rails g model Car name:string
rails g model Feature name:string
rails g model ListedFeature car:references feature:references
应用/模型/ car.rb
class Car < ActiveRecord::Base
has_many :listed_features
has_many :features, through: :listed_features
end
应用/模型/ listed_features.rb
class ListedFeature < ActiveRecord::Base
belongs_to :car
belongs_to :feature
end
应用/模型/ features.rb
class Feature < ActiveRecord::Base
end
答案 0 :(得分:3)
这里的技巧可能是说你需要从功能表中获得三个匹配。
id_list = [1, 2, 3]
Car.joins(:features).
where(features: { id: id_list }).
references(:features).
group(:id).
having("count(*) = ?", id_list.size)
另一种方法是在Car上为has_feature设置一个范围:
def self.has_feature(feature_id)
where(CarFeature.where("car_features.car_id = cars.id and car_features.feature_id = ?", feature_id).exists)
end
然后你可以:
Car.has_feature(1).has_feature(2).has_feature(3)
...或者使用另一个接受一系列功能的类方法使其更加优雅,然后为您多次应用has_feature范围。
它会生成非常有效的SQL。