Rails 5:查询空关联

时间:2019-06-03 15:55:46

标签: ruby-on-rails activerecord

我有两种型号ClientMealWeek,我希望能够任何活动用餐周来吸引所有客户。通过执行以下任一操作,我可以减少活跃的用餐时间:

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 个答案:

答案 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
  )