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

有时不止一位艺术家会在一首歌上。 例如,Jay-z的新歌“A Star is Born”以艺术家Cole为特色,因此将被列为目录中的“Jay-z(特色Cole) – 明星出生”。 我的问题是如何在我的数据库中建模。

现在它非常简单:每首歌都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?字段primary? ,指定给定的表演是否是歌曲的“主要”表现,意味着与该表演相关的艺术家是该歌曲的主要艺术家。

这种方法有意义吗?

是。 你钉了它。

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

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

歌曲(属性:标题)

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

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

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

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

  • 有一首歌(通过表演者) NB has_one:通过不是Rails的核心function
  • 属于表演
  • 属于艺术家

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

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

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

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