рельсы 3.1, как рассчитать количество ответов по внешнему ключу? - PullRequest
0 голосов
/ 12 ноября 2011

У меня есть следующие таблицы:

class FinalExam < ActiveRecord::Base
  belongs_to :course
  has_many :pages, :as => :course_unit, :dependent => :destroy
end

class Page < ActiveRecord::Base
  belongs_to :course_unit, :polymorphic => true
  has_one :quiz
  has_one :slide
end

class Quiz < ActiveRecord::Base
  belongs_to :page
end

class Answers < ActiveRecord::Base
  belongs_to :quiz
end

Итак, у нас есть Answer.Quiz.Page.FinalExam

Учитывая идентификатор FianlExam, какой самый быстрый способ найти все ответы??как это получить?

Я могу изменить дизайн БД, чтобы иметь belongs_to :final_exam в Answers

class Answers < ActiveRecord::Base
  belongs_to :quiz
  belongs_to :final_exam
end

таким образом, я могу сказать Answers.where(:final_exam_id=> params[:id]).count

Нужно ли менять дизайн БД?или это вопрос вопроса?

Мне нужен совет специалиста, пожалуйста.

1 Ответ

1 голос
/ 12 ноября 2011

Прежде всего, я предполагаю, что Quiz должно выглядеть следующим образом:

class Quiz < ActiveRecord::Base
  belongs_to :page
  has_many :answers
end

Если это так, вы можете добавить эти строки в вашу FinalExam модель:

has_many :quizzes, :through => :pages
has_many :answers, :through => :quizzes

Разрешитьзатем вам нужно позвонить

FinalExam.first.answer.count

(Примечание: если вы используете версию Rails <3.1, вам потребуется <a href="https://github.com/ianwhite/nested_has_many_through" rel="nofollow noreferrer"> этот плагин )

Недостаток:этот подход заключается в том, что он становится медленным с большим количеством данных.В этом случае вы захотите настроить счетчик кэша в FinalExam, который обновляется каждый раз, когда добавляется ответ.Это было бы немного сложнее из-за многослойных отношений, которые у вас есть;см. этот пост для получения дополнительной информации:

counter_cache has_many_through sql оптимизация, уменьшить количество запросов sql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...