0

我是 Rails 的新手,上个月左右才开始学习。我有一个关于建立模型关联的问题。我有点碰到了一个地方,我认为我需要回去对我已经做过的事情进行更改。这是场景。

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

有几个重要因素

  • 有多个乐队列表事件
  • 每个乐队都有独特的活动,但也会与其他一些乐队共享一些活动(即当使用该系统的两个乐队一起在同一个场地演奏时)
  • 有关于每个活动的某些信息,这些信息对于活动中的所有乐队都是通用的(即地点、日期、时间、城市、州等)
  • 每个活动都有特定于一个乐队的特定信息(即特定的 VIP 购票 URL、他们自己对活动的描述等)

目前这是它的设置方式:

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 位硬编码的艺术家正确列出。

基本上现在它的工作原理是用户转到创建活动表单,他们选择日期,下一行是场地名称。场地名称表格使用数据库中的场地名称 + 城市自动完成。如果用户在系统中已经存在的场所创建活动,则它实质上通过 Venue 模型将活动信息保存为嵌套属性。如果场地不在系统中,则出现位置数据的附加输入字段,然后创建新场地并与该事件相关联。

当我开始考虑让艺术家共享事件并维护仅针对该艺术家的事件的特定细节时,它开始变得有点棘手。我可以将每个事件视为一个单独的事件,这很容易,但是我不确定我怎么能说这个艺术家在这个日期与这些艺术家一起表演,除了艺术家将这些名字直接输入到 1 字段中。然后我也失去了 ActiveRecords 的很多魔力,关于哪些艺术家与哪些其他艺术家在哪里表演等等。

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

您是否会建议多个模型,或者我是否有更好的方法将演奏多个事件的乐队联系在一起,而不是创建一个事件详细信息模型链接回多个艺术家共享的 1 个主要事件?我是否应该在事件表上创建某种类型的唯一事件标识符,以便将具有不同 ID 的事件视为另一个乐队正在播放的同一事件?我看到的唯一问题是,我将在我的数据库中的很多数据上加倍......我本质上希望能够在查看事件数据的同时说艺术家正在播放的这个日期这场演出,在这个场地,与这些其他乐队一起,而不必简​​单地创建一个“other_artists”列,乐队将简单地列出与他们一起表演的艺术家。

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

4

1 回答 1

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

希望这可以帮助。

于 2012-02-22T08:24:41.320 回答