ActiveRecord查询问题

时间:2011-08-27 15:52:58

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有一个rails 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. 当我在视图中迭代这个时,我必须发出其他查询来显示有关教师[name,deomographics]的信息。我怎样才能更有效地获取它?
  3. 我希望能够做到这一点:

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

1 个答案:

答案 0 :(得分:0)

如果您有学生,那么很容易获得学生老师的奖励:

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

您在学生has_many :teachers, :through=>:interaction中设置的关系使这成为可能。