0

我是新來的Rails剛剛過去的一個月左右的時間學習。我有一個關於建立模型關聯的問題。我覺得我需要回去改變我已經完成的工作。這是場景。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位藝術家的硬編碼。

實質上現在它是如何工作的是用戶去創建一個事件表單,他們選擇日期和下一個線是場地名稱。場地名稱表格自動填充數據庫中的場館名稱+城市。如果用戶在系統中已經建立了一個事件,它實質上通過Venue模型將事件信息保存爲嵌套屬性。如果場地不在系統中,則出現位置數據的額外輸入字段,然後創建新的場地並與該事件相關聯。

它開始變得有點棘手,當我開始思考有藝術家分享活動和維護有關特定於只是藝術家事件具體細節的最佳方式。我可以把每一個事件當作一個單獨的事件來處理,而且這很容易,但是我不確定我可以怎麼說這個藝術家在這一天與這個藝術家一起表演,除了這些藝術家直接將這些名字輸入到1個字段。我也再失去了很多的ActiveRecords的魔術方面,到與其他藝術家在那裏進行的藝術家等

截至目前存在的事件只是1模型,但我想,也許它可能是最好的保留1箇中心模型,僅用於場地,城市,州等多個頻段不共享的事件基礎知識,然後將這些模型鏈接到次要event_details模型以獲取特定於頻段的信息。

你會建議多模型或是否有更好的辦法,我樂隊演奏的多個事件一起比創建一個事件細節模型反向鏈接到多個藝術家共享1個主事件聯繫起來?我應該只在事件表上創建一些類型的唯一事件標識符,以便我將另一個ID與另一個樂隊正在播放的相同事件對待。只有我看到的問題是,那麼我將在我的數據庫中的許多數據上翻倍......我基本上希望能夠在查看事件數據的同時在藝術家正在播放的日期這個節目,在這個場地,與這些其他樂隊不需要簡單地創建一個「other_artists」專欄,樂隊只需列出他們正在執行的藝術家。

對不起,我希望這是有道理的...先感謝您的任何意見!

回答

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 

希望這有助於。

+0

是的我認爲你是對的。謝謝您的幫助。 – brent 2012-02-22 12:26:46

+0

您會如何更新預訂模式?您是否會通過Venue接受嵌套屬性,並以更新正常事件模型的方式進行更新? – brent 2012-02-22 14:27:08

+0

我將通過活動管理預訂。事件控制器將具有關聯視圖的「new_booking」和「update_booking」動作。在Event#show視圖中,您可以爲new_booking操作提供「新預訂」鏈接。在new_booking操作中,您可以將事件訂票關係設爲:'@booking = @ event.booking.new'。然後在相關視圖中,您將允許用戶選擇一位藝術家並輸入任何特殊要求/安排。事件需要接受預訂的嵌套屬性。 – 2012-02-22 19:02:55