如何塑造“特色”的概念(即,当一位艺术家在歌曲中“精选”时)
有时不止一位艺术家会在一首歌上。 例如,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