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 表到 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使用cd.dogTagcd_tracks.id值的表来获取正确的信息。

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

4

1 回答 1

0

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

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

于 2013-02-11T10:05:24.080 回答