0

Railsは、先月かそこらで学んだばかりです。モデルの関連付けの設定について質問があります。私は、戻って、すでに行ったことに変更を加える必要があると思う場所に、ある種の打撃を与えました。これがシナリオです。

今後のイベントを一覧表示するバンド用のアプリケーションを作成しています。

いくつかの重要な要素があります

  • イベントを一覧表示する複数のバンドがあります
  • 各バンドには独自のイベントがありますが、他のバンドといくつかのイベントを共有します(つまり、このシステムを使用する2つのバンドが同じ会場で一緒に演奏している場合)
  • イベントのすべてのバンドに共通する各イベントに関する特定の情報があります(つまり、会場、日付、時刻、都市、州など)
  • 1つのバンドに固有の各イベントに関する特定の情報があります(つまり、特定の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人のアーティストについて適切にリストされているため、アーティストモデルについてはまだあまり行っていません。

基本的に現在の仕組みは、ユーザーがイベントフォームの作成に移動し、日付を選択すると、次の行が会場名になります。会場名フォームは、DBの会場名+都市でオートコンプリートされます。ユーザーがすでにシステム内にある会場でイベントを作成している場合、基本的には会場モデルを介してイベント情報をネストされた属性として保存します。会場がシステムにない場合は、位置データの追加の入力フィールドが表示され、新しい会場が作成され、そのイベントに関連付けられます。

アーティストにイベントを共有させ、そのアーティストのみに固有のイベントに関する特定の詳細を維持させるための最良の方法を考え始めると、少し注意が必要になります。すべてのイベントを個別のイベントとして扱うことができ、それは簡単ですが、1つのフィールドに直接名前を入力するアーティストを除いて、このアーティストがこの日にこのアーティストと一緒に演奏しているとどのように言えるかわかりません。また、どのアーティストが他のどのアーティストとどこで演奏したかなど、ActiveRecordsの魔法の多くを失います。

今のところ、イベントのモデルは1つだけですが、会場、都市、州などの複数のバンドで共有されていないイベントの基本だけを1つの中心的なモデルにして、それらをリンクするのが最善かもしれないと考えています。バンド固有の情報のセカンダリevent_detailsモデルに。

複数のモデルを提案しますか、それとも、複数のアーティストが共有する1つのメインイベントにリンクするイベント詳細モデルを作成するよりも、複数のイベントを再生するバンドをリンクするためのより良い方法がありますか?別のバンドが再生しているのと同じイベントとして別のIDのイベントを処理するように、イベントテーブルにある種の一意のイベント識別子を作成する必要がありますか?それで私が見る唯一の問題は、データベースにあるそのデータの多くを倍増することです...私は基本的に、アーティストがプレイしているこの日にOKと言うイベントデータを見ながらできるようにしたいですこのショーは、この会場で、これらの他のバンドと一緒に、バンドが一緒に演奏しているアーティストをリストするだけの「other_artists」列を作成するだけで済みます。

申し訳ありませんが、それが理にかなっていることを願っています...アドバイスを事前に感謝します!

4

1 に答える 1

0

ここでのあなたの本当の問題は、アーティストとイベントの間の多対多の関係を処理する必要があるということだと思います。イベントには多くのアーティストが予約され、アーティストはスケジュールに沿って多くのイベントを開催します。

1人のアーティストを1つのイベントに具体的に結び付ける「予約」クラスを作成します。この予約は、そのイベントで演奏するそのアーティストのための特別な要件や特別な手配を行うのに適した場所になります。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 に答える