1

これはすでに何百万回も尋ねられていると思います。よく検索していないだけです。次の設定があります: 多くのイベントを持つインストラクターがいます。各イベントにはインストラクター (所有者/作成者) が 1 人しかいません。別のリンケージを追加して、他のインストラクターを関連付けることができるようにしたいが、元のインストラクター (所有者) は保持したい。私は大雑把な ASCII 表現を持っていますが、私の人生では Rails モデルでそれを行う方法を理解することはできません。

                ,-------------------.
                | other_instructors |
                |-------------------|
                | event_id          |-------------.
,---------------| instructor_id     |             |
|               `-------------------'             |
|   ,---------------------.                       |
`->>| instructor          |<--.                   |
    |---------------------|   |   ,------------.  |
    | name                |   |   | event      |<-'
    | email               |   |   |------------|
    | office              |   |   | title      |
    | phone               |   |   | location   |
    | admin?              |   |   | benefit    |
    | notify_recipient?   |   |   | notes      |
    | new_user?           |   |   | start_time |
    | (acts_as_authentic) |   |   | end_time   |
    `---------------------'   |   | live_in?   |
                              `---| instructor |
                                  `------------'
@instructor.events = [... array of events ...]
@associated_events = [... array of events associated but not owned via other_instructors table ...]
@event.instructor = ... One Instructor ...
@event.other_instructors = [... array of other instructors ...]
4

2 に答える 2

1

ASCII の場合は 2 ポイント。

Rails については何も知りませんが、テーブルからインストラクターの外部参照を削除し、関連するイベント テーブルにビット フィールドをevent追加する方が理にかなっていますか?is_primary_instructor

于 2010-09-15T02:21:46.557 に答える
1

シュロモに同意します。

class Instructor < ActiveRecord::Base
  has_many :instruct_events
  has_many events, :through => :instruct_events
end

class InstructEvent < ActiveRecord::Base
  belongs_to :instructor
  belongs_to :event
end

class Event < ActiveRecord::Base
  has_many :instruct_events
  has_many :instructors, :through => :instruct_events
end

class CreateInstructors < ActiveRecord::Migration
  def self.up
    create_table :instructors do |t|
      # name, email, etc
      t.timestamps
    end
  end
end

class CreateInstructEvents < ActiveRecord::Migration
  def self.up
    create_table :instruct_events do |t|
      t.integer :instructor_id
      t.integer :event_id

      t.boolean :is_primary_instructor
      t.timestamps
    end
  end
end

class CreateEvents < ActiveRecord::Migration
  def self.up
    create_table :events do |t|
      # title, location, etc
      t.timestamps
    end
  end
end

したがって、すべてのインストラクターには多くのイベントがあり、すべてのイベントには多くのインストラクターがいます。ただし、1 人のインストラクターをプライマリ インストラクターとして指定する必要があります。

=====更新=====

主講師を参照するには:

class InstructEvent
  # add this:
  named_scope :primary, :conditions => { :is_primary_instructor => true }
end

イベントが与えられた場合、そのイベントの主講師を見つけます。

event.instruct_events.primary.instructor

インストラクターが与えられた場合、インストラクターがプライマリであるイベントを見つけます。

instructor.instruct_events.primary.event

InstructEvents クラスにより良い名前を付けることができるかもしれません。

また、より美しいソリューションも見たいと思っています:D

于 2010-09-15T02:37:08.263 に答える