ActiveRecord中的复杂连接

时间:2017-12-06 10:19:06

标签: ruby-on-rails ruby activerecord

我遇到棘手的ActiveRecord查询问题。

我有三个模型,User,Task和Response。用户提交对任务的响应。我在ActiveRecord中使用has_many,through:pattern。

class Task < ApplicationRecord
  has_many :users, through: :responses
  has_many :responses

class User < ApplicationRecord
  has_many :responses
  has_many :tasks, through: :responses

class Response < ApplicationRecord
  belongs_to :task, optional: false
  belongs_to :user, optional: false

我尝试编写一个查询,在给定user_id的情况下,获取与该用户无关的响应的所有任务。

因此,如果用户1正在查询,并且他只对任务1有响应,那么他应该看到除了任务1之外的所有任务。

2 个答案:

答案 0 :(得分:1)

试试这个:

Task.where('user_id != (?)', User.find(user_id).responses)

Task.joins(:responses).where('responses.user_id != (?)', User.find(user_id))

答案 1 :(得分:1)

一种可能的解决方案是使用子查询来选择用户具有响应的所有任务记录,并且它们将从主查询中排除。这将为您提供User(params [:user_id])没有响应

的所有任务记录
Task.where.not(id: Response.select(:task_id).where(user_id: params[:user_id]))