CD表看起来像这样:
cd.dogtag (primary key)
...
cd_tracks
有id
和tracks
(曲目名称),例如:
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.duration
和cd_tracks2title.position
信息,因为它是一个简单的查找表。
理想情况下,我会保留此关联,因此我仍然可以获取曲目名称,但是需要从CD表到cd_tracks2title
表的另一个关联,通过cd_tracks
表同时使用{ {1}}和cd.dogTag
值可获取正确的信息。
当然,我曾经通过在查询中明确写出Mysql JOIN来完成所有这些,但我想创建Rails关联。
答案 0 :(得分:0)
最后,我选择重新设计数据库,并将单独的ID字段作为单个主键包含在内。虽然使用复合键作为primarys并不违反任何数据库设计约定,但ActiveRecord期望每个表都有一个唯一的主键,它确实使事情变得更容易,所以我已经这样做了。
尽管如此,我很惊讶没有办法在AR中本地处理这个问题,因为它并不罕见。