Вопрос ActiveRecord - PullRequest
       5

Вопрос ActiveRecord

1 голос
/ 27 августа 2011

У меня есть рельсы 3 приложения.

У меня есть следующий сценарий: есть ученики и учителя, которые взаимодействуют. Основываясь на некоторых из этих взаимодействий, учитель может выбрать, чтобы дать ученику вознаграждение, то есть студенческое вознаграждение.

class Student
has_many :interactions
has_many :teachers, :through=>:interaction

class Teacher
has_many :interactions
has_many :students, :through=>:interaction
has_many :rewards

class Interaction
belongs_to :teacher
belongs_to :student
has_many :student_rewards
has_many :rewards, :through=>:student_reward

class Reward
belongs_to :teacher
has_many :student_rewards

class StudentRewards
belongs_to :reward
belongs_to :interaction

This is a crude ERD diagramof the data

Как эксперт кодировал бы эффективный подход к получению всех наград, которые имеют учителя учащегося [не обязательно те, которые выиграл ученик], а также отображает информацию об учителях на дисплее?

Я пробовал это, но я должен отдельно получать информацию об учителе, и это плохо. (при условии, что student_id = 1):

@rewards = Reward.joins(:teacher => :interactions)
                 .where("interactions.student_id=1")
                 .paginate(:page => params[:page], :per_page => 5)

Вопросы:

  1. Это лучший способ сделать это?
  2. Когда я повторяю это в представлении, мне нужно выполнить дополнительные запросы для отображения информации об учителе [имя, демография]. Как я могу получить это более эффективно?

Я хочу иметь возможность сделать это:

<% for reward in @rewards%>
  <%= reward.name, reward.teacher.name, reward.teacher.bio%><br>
<%end%>

1 Ответ

0 голосов
/ 30 августа 2011

Если у вас есть ученик, то получить награду за учителя ученика легко можно так:

@student = Student.find(1)
@rewards = []
@rewards += @student.teachers.collect {|teacher| teacher.rewards }

Отношения, которые вы установили в Student has_many :teachers, :through=>:interaction, делают это возможным.

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