2012-08-07 32 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中本地处理这种情况,因为这并不罕见。

相关问题