2012-08-07 19 views
0

CD表看起來是這樣的:導軌和查找表的關聯,有一個兩列的主鍵

cd.dogtag (primary key) 
... 

cd_tracksidtracks(曲目名稱),例如:

1 Turd On The Run 

cd_tracks2title是從CD表和cd_tracks表中加入多對多的查找表。但它也包含了信息,我想:

cd_tracks2title.dogTag 
cd_tracks2title.trackId 
cd_tracks2title.duration 
cd_tracks2title.position 

cd_tracks2title的主鍵實際上是在2列:

PRIMARY KEY (`dogTag`,`trackId`) 

而且裏面的數據cd_tracks2title可能是這樣的:

1 4 NULL NULL 3:24 11 

問題是我試圖從CD表建立一個Rails關聯到cd_tracks2title使用這2個主要列,但似乎沒有辦法。

如果我這樣做:

# cd_track.rb 
has_and_belongs_to_many :cd, :join_table => 'cd_tracks2title', :foreign_key => 'trackId', :association_foreign_key => 'dogTag' 

#cd.rb 
has_and_belongs_to_many :cd_track, :join_table => 'cd_tracks2title', :foreign_key => 'dogTag', :association_foreign_key => 'trackId' 

這很好,我可以用類似Cd.first.cd_track得到曲目的名字,但我沒有辦法讓cd_tracks2title.durationcd_tracks2title.position信息,因爲它是一個簡單的查找表。

理想情況下,我會同時使用cd.dogTagcd_tracks.id值,以獲得正確的保持這種關聯,所以我仍然可以得到的曲目名稱,但需要從CD表到cd_tracks2title表另一個關聯,通過cd_tracks表信息。

當然,我曾經通過明確寫出查詢中的Mysql JOIN來完成所有這些工作,但是我想創建Rails關聯。

+0

真的,沒辦法做到這一點?甚至沒有寶石? – kakubei 2012-09-12 15:33:56

回答

0

最後我選擇重新設計數據庫,並將單獨的ID字段作爲單個主鍵。雖然使用複合鍵作爲主鍵不違反任何數據庫設計慣例,但ActiveRecord希望每個表都有一個唯一的主鍵,它使事情變得更容易,所以我已經做到了。

不過,我很驚訝沒有辦法在AR中本地處理這種情況,因爲這並不罕見。