Rails 5: запрос пустой ассоциации - PullRequest
1 голос
/ 03 июня 2019

У меня есть две модели Client и MealWeek, и я хочу иметь возможность вытащить всех клиентов без любых активных недель приема пищи.Я могу потянуть недели активного приема пищи, выполнив одно из следующих действий:

Client.find(x).meal_weeks.where(active: true)
Client.find(x).meal_weeks.unused

Я могу легко вытащить клиентов с неделями активного приема пищи:

Client.includes(:meal_weeks).where(meal_weeks: { active: true })

Но то же самоенельзя сказать о клиентах без активных недель еды.Я попытался включить not в запросе выше, но он возвращает всех клиентов с неактивными неделями приема пищи, а не клиентами без активных недель приема пищи ( все еды_недели active: false).

Есть ли способ сделать это?

1 Ответ

3 голосов
/ 03 июня 2019

В rails 5+ вы можете использовать where.not Так что в этом случае ваш запрос будет

Client.where.not(id: 
  Client.select(:id).joins(:meal_weeks)
      .where(meal_weeks: {active: true})
) 

Это будет использовать подзапрос вашей исходной версии в качестве предложения NOT IN.Результирующий SQL

SELECT 
 clients.* 
FROM 
 clients
WHERE 
 clients.id NOT IN ( 
    SELECT 
     clients.id
    FROM 
     clients
      INNER JOIN meal_weeks ON meal_weeks.client_id=clients.id
    WHERE 
      meal_weeks.active= true
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...