2015-09-21 2 views
2

У данного Car есть много features, которые соединены через listed_features. Как я могу найти все cars, у которых есть features с ids1 И 2 И 3? cars может иметь больше features, но они должны иметь первые три features.Где с has_many через

начальной установки:

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 

приложение/модели/featur es.rb

class Feature < ActiveRecord::Base 
end 

ответ

3

Хитрость здесь может заявить, что вы должны получить три матча из таблицы функций.

id_list = [1, 2, 3] 

Car.joins(:features). 
    where(features: { id: id_list }). 
    references(:features). 
    group(:id). 
    having("count(*) = ?", id_list.size) 

Другой подход будет иметь объем на автомобиль для 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.

+0

Это гарантирует, что автомобиль имеет функции 1 и 2 и 3? 'id: id_list' будет в основном делать 1 или 2 или 3, а счетчик только гарантирует, что есть три функции. Не соответствует ли автомобиль с функциями 3,4,5? – Mischa

+0

Это количество строк в таблице функций, которые имеют эти идентификаторы и которые присоединяются к строке таблицы автомобилей. Поэтому автомобили будут возвращены, если у них есть хотя бы необходимые функции. присутствие любых других функций игнорируется. –

+0

А, да, теперь я вижу. Благодарю. – Mischa

Смежные вопросы