我有两种型号的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,但是返回所有具有非活动用餐周的客户端,而不是没有任何活动用餐周的客户端( all meal_weeks‘s active: false)。
有办法这样做吗?
发布于 2019-06-03 16:31:00
在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
)https://stackoverflow.com/questions/56430769
复制相似问题