как найти элементы, имеющие несколько отношений "has_many through" - PullRequest
0 голосов
/ 06 июня 2019

У меня есть модель с отношениями многие-ко-многим, реализованная с использованием "has_many through: Relations. Например,

Car has_many: функции, хотя:: feature_associations

У меня есть списокавтомобили (VIN1, VIN2, VIN3) и список функций: «4-дверный», «6-цилиндровый», «DVD-плеер», «GPS», «Bluetooth Audio», ...

КаждыйАвтомобиль может иметь несколько функций (с помощью ассоциаций функций, которые связывают их вместе).

Теперь я пытаюсь найти автомобили с несколькими функциями. Я хочу найти автомобили, которые имеют как «GPS», так и «4-дверный»."features.

До сих пор я нашел запрос, который даст мне автомобили с любой (ИЛИ) функцией, но я хочу, чтобы все функции (И)

class Feature < ApplicationRecord
  has_many :feature_associations
  has_many :cars, through: :feature_associations
end

class Car < ApplicationRecord
  has_many :feature_associations
  has_many :features, through: :feature_associations
end

class FeatureAssociation < ApplicationRecord
  belongs_to :feature
  belongs_to :car
end

Car.includes(:feature_associations,:features).references(:features).where( features: { name: ["4-door","GPS"] })

Вышеприведенное возвращает все автомобили с 4-дверным или GPS, но я ищу все автомобили с обоими.

1 Ответ

0 голосов
/ 07 июня 2019

Я нашел способ сделать это, но он не очень "activerecord-y".

list = []
Car.includes(:feature_associations,:features).references(:features).where( features: { name: "4-door" }).each do |k| list << k.id end

Car.includes(:feature_associations,:features).references(:features).where(id: list).where( features: { name: "GPS" })...

Это занимает один запрос на каждую выбранную функцию;так что я чувствую, что мог бы сделать хужеС другой стороны, вероятно, есть «правильный способ сделать это», и я очень сомневаюсь, что это так.

У вас есть лучший способ?(Пожалуйста?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...