2014-11-22 50 views
1

我還在學習,以發揮創意與Rails和可以利用的最佳實踐提供一些指導以下Rails的關聯關係:Rails的協會:老師學生類

我有三個型號,教師,學生,&類。教師可以教授任何數量的課程,學生可以參加任何課程,而課程只能由一名教師授課,但可以有1-5名學生。

我的第一個假設是使用follwing:

類: belongs_to的老師 的has_many學生

教師: 的has_many:學生通過=>班

學生: 的has_many:教師通過=>類

我不知道這是否合適,我見過加入tabl的建議ES。任何指導將不勝感激 !

更新:鑑於以下有用用戶的反饋,我建議採用以下解決方案。有人可以驗證這一點嗎?由於一個學生可以有很多類和屬於一類,反之亦然,我需要兩個連接表

class ClassRoomEnrollment < ActiveRecord::Base 
belongs_to :students 
belongs_to :classrooms 
end 

class ClassRoom < ActiveRecord::Base 
belongs_to :teacher 
has_many :students through: classroomenrollment 

end 

class Teacher < ActiveRecord::Base 
has_many :students :through => :classrooms 
end 

class Student < ActiveRecord::Base 
has_many :teachers :through => :classrooms 
has_many :classrooms through: classroomenrollment 
end 
+0

您錯過了'Student:has_many:classes'。基本上,學生和班級之間的關係是HABTM。其他一切都很好。 – 2014-11-22 14:21:53

+0

謝謝@Nitish。我是否還必須添加Teacher has_many:classes? – DaynaJuliana 2014-11-22 20:22:17

+0

對於學生來說,has_many:課程取代has_many老師:我添加的班級關係? – DaynaJuliana 2014-11-22 20:29:21

回答

0

不是一個好名字,教室更好

class ClassRoom < ActiveRecord::Base 
    belongs_to :teacher 
    belongs_to :student # if I have well understand, this is the right association 

    #some validations rules 
    validates :<fieldname>, :<rule> => <value>, ... 

    #callback like :before_save or :after_save, .... 
end 

class Teacher < ActiveRecord::Base 
    has_many :students :through => :classrooms, :depend => :destroy 

    #some validations rules 
    validates :<fieldname>, :<rule> => <value>, ... 

    #callback like :before_save or :after_save, .... 
end 

class Student < ActiveRecord::Base 
    has_many :teachers :through => :classrooms, :depend => :destroy 

    #some validations rules 
    validates :<fieldname>, :<rule> => <value>, ... 

    #callback like :before_save or :after_save, .... 
end 

通過關聯(has_many,has_one,belongs_to)自動創建通過表的連接。你可以訪問像老師的所有學生

teacher.classrooms.first.students e.g. 

我希望這可以幫助你。

+0

謝謝@fellons!兩個問題。首先,爲什麼ClassRoom屬於學生而不是has_many學生? 另外在你上面的例子中,我可以調用student.classrooms.first.teacher(基本上與上面相反) 最後,我是否需要添加任何外部索引? – DaynaJuliana 2014-11-22 20:26:09

+0

其實,在第二次想到@fellons時,我想我需要在ClassRooms和學生之間建立一個連接表。在上述方法中,將無法訪問teacher.classroom.first.students 我想我需要爲課堂和學生創建一個has_many:through關係。請參閱我的更新 – DaynaJuliana 2014-11-22 21:45:07

+0

要實現該關聯:通過教師與課堂之間以及學生與教室之間必須有一個班級(課堂),該班級將student_id和teacher_id分組(請參閱http://guides.rubyonrails.org/association_basics.html一章。 4.2)。不需要創建索引,因爲它在ID字段之間的連接已經編入索引。該加入是雙向的(通過班級課堂):student.classrooms.first.teacher(或簡單的student.teachers)或teacher.students。 – rfellons 2014-11-24 07:54:30