如何使用STI处理master-detail

时间:2012-03-24 09:16:14

标签: ruby-on-rails activerecord polymorphic-associations single-table-inheritance

如果角色是STI表:

class Role< ActiveRecord::Base
   self.inheritance_column= :role_type 
end

学生&amp;辅导员继承角色:

class Student< Role
end

class Counselor< Role
end

StudentDetail会保留有关一名学生的额外信息:

class StudentDetail< ActiveRecord::Base
    belongs_to :student
end

用户既可以是学生也可以是辅导员:

class User< ActiveRecord::Base
    has_many :roles
    has_one :student
    has_one :counselor
end

并且number是StudentDetail中的一列, 而role_id是StudentDetail中的一列

是否可以使用以下语法?

User.first.student.number

含义:“如果Role表有一个学生,其user_id == User.first.id,那么User.first.student不为null,如果StudentDetail有role_id == Student.where(”user_id =?“,User.first .id)。first1.id,让“学生”充当学生详细记录并获取数字字段。“

1 个答案:

答案 0 :(得分:1)

您将拥有开箱即用的间接User.first.student.student_detail.number。我认为这不会太痛苦: - )

我看到两个选项(至少)如何进一步:

  • StudentDetail中定义Student方法的方法:

    def number
      self.student_detail ? self.student_detail.number : nil
    end
    
  • 使用缺少的方法自动执行此操作:

    def method_missing(name, *args, &block)
      self.student_detail ? self.student_detail.send(name, *args, &block) : nil
    end