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