有时不止一位艺术家会出演一首歌。例如,Jay-z的新歌“A Star is Born”以艺术家Cole为特色,因此在目录中将被列为“Jay-z(以Cole为特色) - A Star is Born”。我的问题是如何在我的数据库中对此进行建模。
现在它非常简单:每首歌belongs_to :artist
和每位艺术家has_many :songs
。我想改变这一点,以便歌曲有很多艺术家,一个艺术家被指定为“主要” - 即,如果A,B和C都与给定的歌曲相关联而A是主要的,那首歌曲的艺术家将是显示为“A(特色B和C)”。
这就是我的想法:
曲:
has_many :artists, :through => :performances
艺术家:
has_many :songs, :through => :performances
其中performance
模型将为primary?
设置一个字段,指定给定的效果是否是歌曲的“主要”效果,这意味着与该表演相关联的艺术家是主要艺术家在歌曲上。
这种方法有意义吗?
答案 0 :(得分:2)
是。你钉了它。
答案 1 :(得分:1)
看起来您正在将表演用作连接表,并添加了将歌曲链接到艺术家的信息。但这不能很好地运作。歌曲可以有很多表演,每个表演可以有多个表演者。
我会重组数据库以使用以下结构。不幸的是,将歌曲添加到数据库需要更多的工作,但允许封面,歌曲的多个版本和二重唱。
歌曲(属性:标题)
演奏(外键:Song_id,属性:日期,年份,长度,类型,专辑)
表演者(外键:Performance_id,Artist_id,属性:角色)
艺术家(属性:姓名,出生日期等(其他个人信息))
如果您想强制执行1个主要艺术家/表演,则可以在表演者中进行验证。
class Performers < ActiveRecord::Base
validates_uniqueness_of :role, :scope => [:performance_id], :if => Proc.new{|performer| performer.role == "primary"}
end