2016-03-03 3 views
1

У меня есть три основные модели, которые касаются этого случая. Кратко их отношения, как это:Rails 4 Модель фильтра несколько раз с вложенными атрибутами

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

class Session < ActiveRecord::Base 
    belongs_to :person, inverse_of: :sessions 
    has_many :answers 
end 

class Answer < ActiveRecord::Base 
    belongs_to :session 
end 

Чтобы быть кратким и сосредоточиться на проблеме, я буду суммировать атрибуты модели и сосредоточиться только на модели Ответ поскольку они единственные, что мне нужно, чтобы делать то, что мне нужно. Ответы модели имеют следующие атрибуты:

# == Schema Information 
# 
# Table name: answers 
# 
# id     :integer   not null, primary key 
# session_id   :integer 
# question_option_id :integer 
# created_at   :datetime   not null 
# updated_at   :datetime   not null 
# 

То, что я хочу, чтобы отфильтровать людей записи в соответствии со значением question_option_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}) 

проблема заключается в том, что при этих условиях, поисковый запрос для людей с один ответ, который имеет как значения question_option_id whi ch невозможно. То, что я пытаюсь выполнить, - это сделать запрос для поиска людей, у которых есть эти параметры параметров id среди всех ответов, которыми они обладают. Извините, если мне трудно понять, но это то, что я пытаюсь сделать, я не уверен, что я делаю правильный подход, любые предложения приветствуются.

ответ

1

Это случай relational division. Для вашего случая, что-то подобное сделало бы эту работу:

# 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 
Смежные вопросы