我是刚开始Rails学习的上个月左右。我有一个关于建立模范协会的问题。我遇到了一些问题,我认为我需要回去改变我已经做过的事情。这是一个场景。
我正在为乐队创建一个应用程序来列出即将到来的事件。
有几个重要的因素
有多个乐队列出事件,每个乐队将有独特的事件,但也会与其他一些乐队共享一些事件(即,当两个乐队在同一地点演奏时,together)
。
目前,其设置方式如下:
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我还没有做太多的艺术家模型,因为我只是专注于让事件进入系统,并适当列出了一个艺术家,这是硬编码的。
本质上,现在它的工作方式是用户转到create表单,他们选择日期,下一行是场地名称。场馆名称表单自动使用DB中的场地名称+ City完成。如果用户正在系统中的某个场所创建一个事件,它实际上是通过场馆模型将事件信息保存为一个嵌套属性。如果地点不在系统中,则会出现用于位置数据的附加输入字段,然后创建一个新的地点并与该事件相关联。
当我开始思考让艺术家们分享事件的最佳方式,并保持特定于该艺术家的事件的特定细节时,它开始变得有点棘手。我可以把每一件事当作一个单独的事件来处理,这很容易,但是我不知道我怎么能说这位艺术家在这一天和这位艺术家一起表演,除了艺术家们把这些名字直接输入到一个字段之外。然后,我也失去了许多ActiveRecords的魔力,关于哪些艺术家在哪里与其他艺术家一起表演,等等。
到目前为止,只有一个模型用于活动,但我想也许最好保留一个中心模型,用于多个乐队(如场馆、城市、州等)不共享的活动基础,然后将其链接到二级event_details模型以获取特定的乐队信息。
你会建议多个模型吗?还是有更好的方法让我把乐队演奏多个事件联系在一起,而不是创建一个事件细节模型,链接到多位艺术家共享的一个主要事件?我是否应该在events表上创建某种类型的唯一事件标识符,以便将具有不同ID的事件视为其他乐队正在播放的同一事件?我所看到的唯一问题是,我将加倍处理我数据库中的很多数据……我本质上希望能够在查看活动数据时说:“在这一天,艺术家正在表演这个节目,在这个场地里,其他乐队只需简单地制作一个"other_artists”栏目,乐队就可以简单地列出他们正在表演的艺术家。
对不起,我希望这能使sense...thanks提前得到任何建议!
发布于 2012-02-22 08:24:41
我认为你真正的问题是你需要处理艺术家和活动之间的多到多的关系。活动将有许多艺术家预定,艺术家将有许多活动在他们的日程。
我会创建一个“预订”类,专门把一个艺术家和一个活动联系起来。这项预订将是一个很好的地方举行任何特殊要求或特别安排的艺术家发挥在该活动。使用ActiveRecord的"has_many : will“关系将使这非常直接,并使您在查询数据方面具有很大的灵活性。我会这样做:
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希望这能有所帮助。
https://stackoverflow.com/questions/9388775
复制相似问题