Rails与具有两列主键的查找表的关联

时间:2012-08-07 09:09:49

标签: mysql ruby-on-rails-3.1 associations

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表到cd_tracks2title的Rails关联,但似乎没有办法。

如果我这样做:

# 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表到cd_tracks2title表的另一个关联,通过cd_tracks表同时使用{ {1}}和cd.dogTag值可获取正确的信息。

当然,我曾经通过在查询中明确写出Mysql JOIN来完成所有这些,但我想创建Rails关联。

1 个答案:

答案 0 :(得分:0)

最后,我选择重新设计数据库,并将单独的ID字段作为单个主键包含在内。虽然使用复合键作为primarys并不违反任何数据库设计约定,但ActiveRecord期望每个表都有一个唯一的主键,它确实使事情变得更容易,所以我已经这样做了。

尽管如此,我很惊讶没有办法在AR中本地处理这个问题,因为它并不罕见。