Rails Association选项

时间:2012-02-22 03:38:40

标签: ruby-on-rails ruby-on-rails-3 associations model-associations

我是Rails的新手,刚刚学习了上个月左右。我有关于建立模型关联的问题。我有点想到我需要回去改变我已经做过的事情。这是场景。

我正在创建一个乐队的应用程序来列出即将发生的事件。

有几个重要因素

  • 有多个频道列出事件
  • 每个乐队都会有独特的活动,但也会与其他一些乐队分享一些活动(即当使用这个系统的两个乐队一起演奏同一场地时)
  • 关于活动的所有乐队(即场地,日期,时间,城市,州等)共有的每个活动都有一些信息。
  • 某个频段特定的每个事件都有一定的信息(即特定的VIP门票购买网址,他们自己对事件的描述等)

目前这就是它的设置方式:

class Event < ActiveRecord::Base    
  belongs_to :venue
  scope :upcoming, where('date >= ?', Date.today)
end  

class Venue < ActiveRecord::Base
  has_many :events
  accepts_nested_attributes_for :events
end

我还没有真正完成艺术家模型的工作,因为我只是专注于将事件输入系统并正确列出1名硬编码的艺术家。

现在基本上它是如何工作的,用户去创建一个事件表格,他们选择日期,下一行是场地名称。场地名称表格自动填充来自DB的场地名称+城市。如果用户在系统中已经存在的场所创建事件,它实际上通过Venue模型将事件信息保存为嵌套属性。如果场地不在系统中,则会显示位置数据的附加输入字段,然后创建一个新场地并与该事件相关联。

当我开始考虑让艺术家分享活动并保持特定于该艺术家特定事件的特定细节的最佳方式时,开始变得有点棘手。我可以把每个事件视为一个单独的事件,这很容易但是我不知道我怎么能说这个艺术家在这个日期与这些艺术家一起表演,除了艺术家直接将这些名字输入1个领域。然后我也失去了很多ActiveRecords的魔力,关于哪些艺术家与其他艺术家一起表演等等。

截至目前,只有1个活动模型,但我想也许最好保留1个中心模型,仅用于场地,城市,州等多个乐队不共享的活动基础知识。然后将这些链接链接到辅助event_details模型以获取特定于频段的信息。

你会建议多个模型,还是有更好的方法将链接多个事件的乐队链接起来,而不是创建一个链接回多个艺术家分享的1个主要事件的事件详细信息模型?我是否应该在事件表上创建某种类型的唯一事件标识符,以便我将具有不同ID的事件视为另一个乐队正在播放的同一事件?只有我看到的那个问题就是我将要加倍我的数据库中的大量数据......我基本上希望能够在查看事件数据的同时在艺术家正在播放的日期说好这个节目,在这个场地,这些其他乐队不得不简单地制作一个“other_artists”专栏,乐队只会列出他们正在表演的艺术家。

对不起,我希望这是有意义的...提前感谢任何建议!

1 个答案:

答案 0 :(得分:0)

我认为你真正的问题是你需要处理艺术家和事件之间的多对多关系。活动将有许多艺术家被预订,艺术家将按照他们的日程安排许多活动。

我会创建一个“预订”课程,专门将一位艺术家与一个事件联系起来。这个预订将是举办该活动的艺术家的特殊要求或特殊安排的好地方。使用ActiveRecord的“has_many:through”关系将使这非常简单,并为您提供查询数据的灵活性。我将如何做到这一点:

class Event < ActiveRecord::Base    
  belongs_to :venue
  has_many :artists, :through => :bookings
  scope :upcoming, where('date >= ?', Date.today)
end  

class Venue < ActiveRecord::Base
  has_many :events
  accepts_nested_attributes_for :events
end

class Artist < ActiveRecord::Base
  has_many :events, :through => :bookings
end

class Booking < ActiveRecord::Base
  belongs_to :artist
  belongs_to :event
  attr_accessible :special_requirements, :special_arrangements
end

一些例子说明了通过这些关系查询数据所带来的灵活性:

 @venue.events
 @venue.events.where(:id => specific_event.id).first.artists
 @event.artists
 @artist.events
 @event.bookings each do |b|
   b.artist
   b.special_requirements
 end

希望这有帮助。