我遇到棘手的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之外的所有任务。
答案 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]))