Pregunta de consulta de ActiveRecord

Tengo una aplicación de rieles 3.

Tengo el siguiente escenario: hay estudiantes y profesores que tienen interacciones. Con base en algunas de estas interacciones, un maestro puede optar por darle a un estudiante una recompensa, es decir, una recompensa para el estudiante.

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

Este es un diagrama ERD burdo de los datos

¿Cómo podría un experto codificar un enfoque eficiente para obtener todas las recompensas que los maestros de un estudiante tienen [no necesariamente las que el estudiante ha ganado] y también enumerar información sobre los maestros en la pantalla?

Intenté esto, pero tengo que obtener la información del maestro por separado en la vista, y esto es malo. (asumiendo el student_id = 1):

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

Preguntas:

  1. ¿Es esta la mejor manera de hacerlo?
  2. Cuando estoy iterando a través de esto en la vista, tengo que emitir consultas adicionales para mostrar información sobre el maestro [nombre, deomografía]. ¿Cómo puedo recuperar esto de manera más eficiente?

Quiero poder hacer esto:

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

preguntado el 27 de agosto de 11 a las 15:08

1 Respuestas

Si tiene el estudiante, entonces obtener las recompensas para el maestro del estudiante se obtiene fácilmente de la siguiente manera:

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

La relación que estableciste en Student has_many :teachers, :through=>:interaction que hace esto posible.

Respondido 30 ago 11, 22:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.