0

如果角色是一個STI表:如何處理主詳細STI

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

和學生&輔導員繼承角色:

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 

和數量是StudentDetail列, 而ROLE_ID是StudentDetail列

是否有可能得到下面的語法來工作?

User.first.student.number 

含義: 「如果角色表有一個學生,USER_ID == User.first.id然後User.first.student不爲空,如果StudentDetail已經ROLE_ID == Student.where(」 USER_ID =「? ,User.first.id).first.id,將「student」作爲StudentDetail記錄並獲取編號字段。「

回答

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 
    
+0

well def number; self.try(:student_detail)。嘗試(:數);結束 會更加緩和。 我最終做了「has_one student_detail通過學生」 ,但爲method_missing +1。 – nurettin 2012-03-31 11:29:25