Sql Rails 4使用嵌套属性多次筛选模型

Sql Rails 4使用嵌套属性多次筛选模型,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我有三个主要的模型来处理这个案例。简而言之,他们的关系如下: class Person < ActiveRecord::Base has_many :sessions, dependent: :delete_all, inverse_of: :person has_many :answers, through: :sessions end 我想要的是根据表单中提供的问题选项id值过滤人员记录,用户可以选择使用一个或多个答案问题选项值进行过滤。 发送值时没有出现问题,但我尝试筛选

我有三个主要的模型来处理这个案例。简而言之,他们的关系如下:

class Person < ActiveRecord::Base
  has_many :sessions, dependent: :delete_all, inverse_of: :person
  has_many :answers, through: :sessions
end

我想要的是根据表单中提供的问题选项id值过滤人员记录,用户可以选择使用一个或多个答案问题选项值进行过滤。 发送值时没有出现问题,但我尝试筛选人员记录但未成功,这是我最近一次部分成功:

people = Person.all
people = people.joins(:answers).uniq.where(answers: {question_option_id: some_param})
使用此选项,我可以使用一个问题选项的值进行筛选,当我尝试筛选多个问题选项时,问题会出现,它不会返回任何结果,这就是我尝试过的:

people = Person.all
people = people.joins(:answers).uniq.where(answers: {question_option_id: some_question_option_id_param})
people = people.joins(:answers).uniq.where(answers: {question_option_id: another_question_option_id_param})
问题是,在这些条件下,查询将搜索回答为一个且同时具有问题\u选项\u id值的人,这是不可能的。我试图完成的是在所有答案中搜索那些拥有这些问题选项id的人。很抱歉,如果我很难理解,但这正是我试图做的,我不确定我是否做了正确的方法,欢迎任何建议。

这是一个案例。就你的情况而言,类似这样的东西可以起到作用:

# question_option_ids = [some_param, some_other_param, ...]
people = Person.all
question_option_ids.each do |question_option_id|
  people = people.where('EXISTS (SELECT * FROM sessions s INNER JOIN answers a ON s.id = a.session_id WHERE s.person_id = people.id AND a.question_option_id = ?)', question_option_id)
end
people = Person.all
people = people.joins(:answers).uniq.where(answers: {question_option_id: some_param})
people = Person.all
people = people.joins(:answers).uniq.where(answers: {question_option_id: some_question_option_id_param})
people = people.joins(:answers).uniq.where(answers: {question_option_id: another_question_option_id_param})
# question_option_ids = [some_param, some_other_param, ...]
people = Person.all
question_option_ids.each do |question_option_id|
  people = people.where('EXISTS (SELECT * FROM sessions s INNER JOIN answers a ON s.id = a.session_id WHERE s.person_id = people.id AND a.question_option_id = ?)', question_option_id)
end