Запрос Rails has_and_belongs_to_many с точным подсчетом - PullRequest
0 голосов
/ 11 июля 2020

У меня следующая настройка

class Cake
  has_and_belongs_to_many :ingredients # through a join table 
end

class Ingredient
 # secret_id , optional integer column. 
end

Я получаю несколько секретных идентификаторов. Я хочу сгенерировать запрос, который возвращает Cakes, только если я смогу получить все ингредиенты.

Cake A: 
  Ingredient A -> secret id -> 1
  Ingredient B -> secret id -> nil

Cake B: 
  Ingredient C -> secret id -> 3
  Ingredient D -> secret id -> nil

Допустим, мы получили запрос со следующими параметрами: [3,4,5] Мой текущий запрос выглядит так

Cake.includes(:ingredients).where(ingredients: { secret_id: secret_id_params + [nil] })

Проблема в том, что он вернет и торт A, и торт B. Он вернет торт A, потому что у него есть нулевой секретный идентификатор в одном из его ингредиентов. Я не хочу возвращать торт А, потому что не нашел всех ингредиентов.

1 Ответ

0 голосов
/ 11 июля 2020

Думаю, вам просто нужно что-то вроде этого

  Cake.includes(:ingredients).where 
   ingredients: { secret_id: secret_id_params + 
      [nil] } and count(ingredients) = Ingredients.(
         count(distinct secretid) ) 
...