Rails 的 Many-to-Many 討論

Rails 的 ActiveRecord:Associations 讓你建立資料表之間的關係,其中一對一跟一對多關係都還算簡單,多對多比較複雜一點。Rails 有兩個方法可以做到,has_and_belongs_to_manyhas_many :through。後者是 Rails 1.1 才有的,所以 Agile Web Development with Rails 一書並沒有提到。

我的頭一個問題是,這兩個有什麼差別,應該用哪一個?? 找了一下有發現有 habtm vs has_many :through 這篇跟 Many-to-many Dance-off!。Dance-Off 那篇很仔細的比較兩者的差異,也給了一個範例,值得一看。

主要來說 has_and_belongs_to_many 比較簡單,但是那個 join table 不適合再加欄位值,比如說該關聯建立的時間之類的,雖然 push_with_attributes 這個方法可以塞資料進去,但是卻是很亂的糟方式,已經不被推薦使用。

而 has_many :through 功夫多一些,結構更完整,用新增一個 join model 的方式來建立關聯資料。自己有一個 model class,因此使用上也比較豐富。就像一般 model 一樣,先 new 一個出來,assign 好那兩個關聯物件,再填好其它資料,最後 save 即可。

Leave a Reply