带有has_many的地方

时间:2015-09-21 13:37:34

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

给定的Car有许多features通过listed_features连接。如何查找carsfeatures ids12的所有3cars可以有更多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

1 个答案:

答案 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。