2016-04-24 2 views
1

У меня есть несколько родственных моделей: Categoryhas_manyQuestion. Questionhas_manyAnswer. Мне нужно:Активная запись получить родительские записи на основе дочерних данных

  1. Получить все категории, где по крайней мере один Question имеет Answer
  2. Графа все вопросы, что есть по крайней мере один Answer (сколько вопросов в Category есть ответы)

  3. Получить все Категории, в которых все вопросы имеют 0 ответов

  4. Подсчитайте все вопросы, у которых нет ответов (Сколько вопросов внутри Category, у которых нет ответов).

EDIT

Если я хочу получить список категорий с ответами и перечнем категорий без ответов?

cats = [] 
@categories_with_answers = Category.all.each do |cat| 
    cats << cat if cat.questions.joins(:answers).count > 0 
end 

Как я могу написать этот фрагмент более чистым способом?

ответ

1

Вы можете использовать includes и joins для запроса отношений:

  1. Category.joins(questions: :answers)

  2. Question.joins(:answers).count

  3. Category.includes(questions: :answers).where(questions: { answers: { question_id: nil }})

  4. Question.includes(:answers).where(answers: { question_id: nil })

Существует хорошая статья в блоге, в которой более подробно рассматриваются эти подходы здесь: https://www.pagerduty.com/blog/sql-left-join-trick/.

EDIT

Для отдельной категории, запрос похож:

@category = Category.find(params[:category_id]) 

@category.questions.joins(:answers).count 

Это было бы эквивалентно:

Question.joins(:answers).where(questions: { category_id: @category.id }).count 

Тот же принцип применим и к includes ...

@category.questions.includes(:answers).where(answers: { question_id: nil }) 
+0

Спасибо за помощь, как я могу получить результаты по 2 и 4 за каждую категорию? Мне нужно задавать вопросы с помощью одного ответа для каждой моей категории. И, также, мне нужно посчитать все вопросы без ответа для каждой моей категории. –

+0

См. Мой обновленный ответ. –

+0

Я обновляю свой вопрос, см. Пожалуйста –

Смежные вопросы