在轨道中建立关系

时间:2012-10-29 15:39:03

标签: ruby-on-rails ruby associations

我在两个表之间有许多关系,条件代表不同的角色。

class Course < ActiveRecord::Base
  ...
  has_many :course_mentors, :conditions => { :type_str => "mentor" }, :class_name => CourseUser
  has_many :mentors, :through => :course_mentors, :source => :user

  has_many :course_enrollees, :conditions => { :type_str => "enrollee" }, :class_name => CourseUser
  has_many :enrollees, :through => :course_enrollees, :source => :user
  ...
end

要自行检索其中一个关联的内容,我可以简单地执行@ course.enrollees,@ course.mentors等。但有时候,能够同时获得两个注册人和导师都会很方便。

我有许多不同的关联,这使得为单个关联的每个组合创建额外的关联变得不切实际。一个人总能做到

(@course.enrollees + @course.mentors).sort

然而,这会导致对数据库的两个请求以及可能重复的条目。

我还调查了关联的merge函数,但这只返回一个空关系。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:4)

您只需在课程模型中添加一个与CourseUser的常规关联:

has_many :course_users

然后在ScopeUser模型中放置一个范围:

scope :of_type, lambda {|types| where(:type_str => types)}

然后您可以通过以下方式访问它:

my_course = Course.first
my_course.course_users.of_type([:mentor, :enrollee])