Rails 3 запрос «многие ко многим» - PullRequest
1 голос
/ 19 июля 2011

Здравствуйте, я хочу создать запрос, который будет выглядеть примерно так: "Дайте мне разнообразие, содержащее следующие ингредиенты (1,2,3)"

Вот мои модели

class Ingredient < ActiveRecord::Base
  has_and_belongs_to_many :varieties

class Variety < ActiveRecord::Base
  has_and_belongs_to_many :ingredients

Я ломал голову, но не смог понять это правильно, может кто-нибудь помочь мне, пожалуйста.Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Исправлено после комментария Дилана. Я разбил where_clause на многострочную строку для удобства чтения.

ingredient_list = [1,2,3]
where_clause = %{
varieties.id IN
(SELECT v.variety_id FROM 
(SELECT variety_id, count(*) as cnt FROM ingredients_varieties WHERE ingredient_id in (#{ingredient_list.join(',')}) GROUP BY variety_id) v 
WHERE v.cnt = #{ingredient_list.size})
} 
Variety.where(where_clause)
1 голос
/ 19 июля 2011

Не знаю о производительности (и мы не знаем, чтобы оптимизировать преждевременно), но это определенно более читабельно, чем чистый SQL:

@ingredients = Ingredient.includes(:varieties).find [1,2,3]
@varieties = @ingredients.collect(&:varieties).inject(&:&).reject{|v| v.ingredients.size != @ingredients.size}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...