如何塑造“特色”的概念(即,当一位艺术家在一首歌中“精选”时)

时间:2009-09-24 02:14:50

标签: ruby-on-rails activerecord model modeling

有时不止一位艺术家会出演一首歌。例如,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?设置一个字段,指定给定的效果是否是歌曲的“主要”效果,这意味着与该表演相关联的艺术家是主要艺术家在歌曲上。

这种方法有意义吗?

2 个答案:

答案 0 :(得分:2)

是。你钉了它。

答案 1 :(得分:1)

看起来您正在将表演用作连接表,并添加了将歌曲链接到艺术家的信息。但这不能很好地运作。歌曲可以有很多表演,每个表演可以有多个表演者。

我会重组数据库以使用以下结构。不幸的是,将歌曲添加到数据库需要更多的工作,但允许封面,歌曲的多个版本和二重唱。

歌曲(属性:标题)

  • 有很多演出
  • 有很多表演者(通过表演)
  • 有很多艺术家(通过表演者)

演奏(外键:Song_id,属性:日期,年份,长度,类型,专辑)

  • 属于Song
  • 有很多表演者
  • 有很多艺术家(通过表演者)

表演者(外键:Performance_id,Artist_id,属性:角色)

  • 有一首歌曲(通过表演者) N.B。 has_one:through不是Rails的核心功能
  • 属于Performances
  • 属于Artist

艺术家(属性:姓名,出生日期等(其他个人信息))

  • 有很多表演者
  • 有很多表演(通过表演者)
  • 有很多歌曲(通过表演)

如果您想强制执行1个主要艺术家/表演,则可以在表演者中进行验证。

class Performers < ActiveRecord::Base
  validates_uniqueness_of :role, :scope => [:performance_id], :if => Proc.new{|performer| performer.role == "primary"}
end