如果角色是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,让“学生”充当学生详细记录并获取数字字段。“
答案 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