【发布时间】:2009-04-22 17:00:20
【问题描述】:
我试图了解 ActiveRecord 如何处理比简单的has_many、belongs_to 等更复杂的关联。
例如,考虑一个用于录制音乐演出的应用程序。每个演出都有一个乐队,它有一个流派。每个 Gig 也有一个 Venue,它有一个 Region。
在 MS Access 的粗略表示中(我突然开始对它感到非常怀念),这些关系会这样呈现
1 ∞ 1 ∞ ∞ 1 ∞ 1
Genre ---- Band ---- Gig ---- Venue ---- Region
例如,我希望能够找出在某个地区演出过的所有乐队,或者拥有某种流派的所有场地。
理想情况下,我的模型将包含此代码
class Genre
has_many :bands
has_many :gigs, :through => bands
has_many :venues, :through => :gigs, :uniq => true
has_many :regions, :through => :venues, :uniq => true
end
class Band
belongs_to :genre
has_many :gigs
has_many :venues, :through => :gigs, :uniq => true
has_many :regions, :through => :venues, :uniq => true
end
class Gig
belongs_to :genre, :through => :band
belongs_to :band
belongs_to :venue
belongs_to :region, :through => :venue
end
Venue 和 Region 以此类推。
但是,我似乎必须制作类似的东西
class Genre
has_many :bands
has_many :gigs, :through => bands
has_many :venues, :finder_sql => "SELECT DISTINCT venues.* FROM venues " +
"INNER JOIN gigs ON venue.id = gig.venue_id " +
"INNER JOIN bands ON band.id = gig.band_id " +
"WHERE band.genre_id = #{id}"
# something even yuckier for regions
end
class Band
belongs_to :genre
has_many :gigs
has_many :venues, :through => :gigs, :uniq => true
# some more sql for regions
end
class Gig
delegate :genre, :to => :band
belongs_to :band
belongs_to :venue
delegate :region, :to => :venue
end
我有两个问题 - 一是一般问题,一是特殊问题。
将军:
我原以为我尝试做的事情会经常出现。我真的有最好的方法吗,还是我忽略了一些更简单的方法?
特别的:
我上面的内容实际上并不完全有效!第二种流派模型中的#{id}实际上是返回类的id。 (我认为)。然而,这似乎工作here 和here
我意识到这是一个相当史诗般的问题,所以如果你能做到这一点,谢谢。任何帮助将不胜感激!
【问题讨论】:
标签: sql ruby-on-rails activerecord