請問有二個以上的Foreign Key 的表格如何用 active record ?


#1

像 has_many , belongs_to 的設計都是使用二個 table 的處理…

但如果像下圖的…(學生成績表)中有學號(FR-1),課程(FR-2)再搭配出成績…

這個在 Active Record 可以用 association 使用??

還是表格自已生好欄位…然後資料一筆一筆自已塞?(自幹法…)

一般使用 active record 的 association 好像也只有一個 foreign key 的搭配…

還是那有理解上的錯誤??

謝謝


#2

嗯…其實就是多對多關連,請用這招(別招都不建議)

A <=> B <=> C

class A < ActiveRecord::Base
   has_many :b
   has_many :c , :through => :b
end
class C < ActiveRecord::Base
   has_many :b
   has_many :a , :through => :b
end
class B < ActiveRecord::Base
   belongs_to :a
   belongs_to :c
end
#B上有a_id , c_id

解決,這就是最基本的多對多的方式就是,至於你中間的那個B可以不止 A / C 可以拉更多的手就是了,而不管怎樣的關連都把核心部分丟成B,而非

#(X錯誤)    A <=> B <=> C <=> D....

N個關連應該都收斂在中間的表,類似 demo 只有一個 B,但有非常多個對外關連,類似 A / C / D…缺點可能會是 B 的重複次數會過多而已(不過這要看需求才來看如何設計,[最下]),而用這方式就可以設定每個 relation 間還有其他快取值的儲存

以下繼續複雜下去

A <=> B <=> C
      ^
      v
      D

class A < ActiveRecord::Base
   has_many :b
   has_many :c , :through => :b
   has_many :d , :through => :b
end
class C < ActiveRecord::Base
   has_many :b
   has_many :a , :through => :b
   has_many :d , :through => :b
end
class D < ActiveRecord::Base
   has_many :b
   has_many :a , :through => :b
   has_many :c , :through => :b
end
class B < ActiveRecord::Base
   belongs_to :a
   belongs_to :c
   belongs_to :d
end
#B上有a_id , c_id , d_id

還有值的設計

#設計(a)
1 : A1 , C1 , D1
2 : A2 , C2 , D2

#設計(b)
1 : A1 , C1 , nil
2 : nil, C1 , D1

就這樣而已,至於如何實做這關連?其實就自幹把 id 塞進去填對了就會動了,因為這類的gem都不是很好用,所以建議依照"實做"才來規劃,類似在 B 寫個 self.build_relationmethod 來把 A / C / D 甚至快取值全部餵進去,而非想打一群廣用但其實你用不太到的 methods(我以前很愛這樣幹,結果發覺太浪費時間且不會用到|||),以上


#3

了解了…來試試自已的實做…

因為有想過上次 快取的方式…

把其實像 C的關連直接餵數值到 B的其中一欄…

只要 C有變動就自動再塞到 B的其中一欄…

這樣就可以省去 C 的 join 之類的(假設 C的值變動比較少而和 B的關係比較固定)

果然捉住精神就比較有 fu…

謝 jc…有問題再續問…


#4

yep~ 有快取能快取就一定要用,畢竟硬碟空間不值錢 : )