我有两种型号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
。
有没有办法做到这一点?
答案 0 :(得分:3)
在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
)