Передать условия в подзапросы - rails activerecords

У меня есть модель QuestionCategory, которая имеет много вопросов.

Когда я делаю этот запрос @quizzs = QuestionsCategory.find(:all), все в порядке. Он запрашивает все категории и связанные с ними вопросы:

QuestionsCategory Load (0.2ms)  SELECT `questions_categories`.* FROM `questions_categories` 
  Question Load (0.3ms)  SELECT `questions`.* FROM `questions` WHERE `questions`.`questions_category_id` = 1
  Question Load (0.4ms)  SELECT `questions`.* FROM `questions` WHERE `questions`.`questions_category_id` = 2
  Question Load (0.3ms)  SELECT `questions`.* FROM `questions` WHERE `questions`.`questions_category_id` = 3

Но я хотел бы передать условие подзапросам вопросов. Что-то вроде @quizzs = QuestionsCategory.find(:all, :questions => [ :conditions => {MY CONDITIONS} ])

И затем получить подзапросы, выглядящие так:

ВЫБЕРИТЕ вопросы.* ОТ вопросов ГДЕ questions.questions_category_id = 2 AND MY CONDITIONS

Возможно? Ура друзья


person Gozup    schedule 21.02.2013    source источник
comment
вы используете рельсы 2 или 3?   -  person jvnill    schedule 21.02.2013


Ответы (3)


Чтобы получить результат для вашего SQL ( SELECT questions.* FROM questions WHERE questions.questions_category_id = 2 AND MY CONDITIONS), вы можете сделать следующее:

  QuetionsCategory.find(2).questions.all(:conditions => [Your conditions])
person Rahul Tapali    schedule 21.02.2013
comment
Это результат, который я хочу, НО я хотел бы автоматически применять это условие к подзапросам, вызывая одну строку QuestionsCategory.find(:all). Это всегда будет одно и то же условие для каждого подзапроса. В противном случае я должен сделать цикл... - person Gozup; 21.02.2013
comment
Затем вам нужно использовать join : QuetionsCategory.joins(:questions).where( Your conditions) - person Rahul Tapali; 21.02.2013

Как насчет размаха?

Контроллер категории вопросов:

def your_action_name
  @quizzs = QuestionsCategory.all.collect{|qc| qc.questions.published == true}

Модель вопроса:

class Question < ActiveRecord::Base
  scope :published, where(:published => true)
end

Таким образом, вы можете связать все области действия (условия), которые хотите применить к Question

person AdamT    schedule 21.02.2013

Вам нужна область по умолчанию в вашей модели.

помещает это в вашу модель QuestionCategory.

default_scope joins(:questions).where(conditions)

Затем

QuestionCategory.all Должен дать ожидаемый результат.

person Abibullah Rahamathulah    schedule 21.02.2013