3

私はググったり、ドキュメントを読んだり、レールキャストを見たりしましたが、これについて頭を悩ませることはできません。助けてください。Ubuntu 13.04 で最新の安定した Rails と Ruby 1.9.3 を実行しています。

私にはUserモデルとEventモデルがいます。現在、has_and_belongs_to_many両者の間には関係があります。

ただし、実際には、 a はaまたは aとしてにUser関連付けられます。Aは aとの両方になることができますが、同じイベントではありません。 またはまだ私のアプリのモデルではありません。それらを個別のモデルにする必要があるかどうかはわかりません。このロジックの実装について助けが必要です。EventLecturerStudentUserStudentLecturerLecturerStudent

私が達成したいのは次のようなものです:

Event.first.lecturers# この特定のイベントの講師であるユーザーを返す必要があります。

Event.first.students# この特定のイベントの学生であるユーザーを返す必要があります

User.first.events :as => :student# ユーザーが学生である特定のユーザーのイベントを返す必要があります

User.first.events :as => :lecturer# ユーザーが講師である特定のユーザーのイベントを返す必要があります

おそらくhas_many :through協会が機能するのではないかと考えていますが、とても混乱しています。すべてのガイダンスに感謝します。

よろしく、

ナディーム

4

1 に答える 1

4

2 つの結合テーブルevents_studentsを作成しevents_lecturers、次のようにモデルをセットアップできます

class Event < ActiveRecord::Base
  has_and_belongs_to_many :students, :class_name => 'User', :join_table => :events_students, :association_foreign_key => :user_id
  has_and_belongs_to_many :lecturers, :class_name => 'User', :join_table => :events_lecturers, :association_foreign_key => :user_id
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :student_events, :class_name => 'Event', :join_table => :events_students, :association_foreign_key => :event_id
  has_and_belongs_to_many :lecturer_events, :class_name => 'Event', :join_table => :events_lecturers, :association_foreign_key => :event_id
end

そしてそれにアクセスします:

Event.first.students
Event.first.teachers
User.first.student_events
User.first.lecturer_events

アップデート。

別の解決策は、 has_many :through を使用することです

class User < ActiveRecord::Base 
  has_many :event_assignments
  has_many :student_events, :through => :event_assignments, :source => :event, :conditions => {'event_assignments.type' => 'EventAssignment::Student'}
  has_many :lecturer_events, :through => :event_assignments, :source => :event, :conditions => {'event_assignments.type' => 'EventAssignment::Lecturer'}
end

class Event < ActiveRecord::Base 
  has_many :event_assignments
  has_many :students, :through => :event_assignments, :source => :user, :conditions => {'event_assignments.type' => 'EventAssignment::Student'}
  has_many :lecturers, :through => :event_assignments, :source => :user, :conditions => {'event_assignments.type' => 'EventAssignment::Lecturer'}
end

class EventAssignment < ActiveRecord::Base 
  belongs_to :user
  belongs_to :event
end

class EventAssignment::Student < EventAssignment
end

class EventAssignment::Lecturer < EventAssignment
end

EventAssignment モデルに STI を使用しています。割り当ての種類ごとに異なるロジックがある場合に役立つからです。ただし、必要ない場合はtype、結合モデルの代わりに別の列名を使用して、リレーション タイプを識別します。

class User < ActiveRecord::Base 
  has_many :event_assignments
  has_many :student_events, :through => :event_assignments, :source => :event, :conditions => {'event_assignments.kind' => 'student'}
  has_many :lecturer_events, :through => :event_assignments, :source => :event, :conditions => {'event_assignments.kind' => 'lecturer'}
end

class Event < ActiveRecord::Base 
  has_many :event_assignments
  has_many :students, :through => :event_assignments, :source => :user, :conditions => {'event_assignments.kind' => 'student'}
  has_many :lecturers, :through => :event_assignments, :source => :user, :conditions => {'event_assignments.kind' => 'lecturer'}
end

class EventAssignment < ActiveRecord::Base 
  belongs_to :user
  belongs_to :event
end
于 2013-05-12T15:51:42.373 に答える