使用has_many AND has_one将两个表链接在一起?

时间:2010-09-15 00:34:57

标签: ruby-on-rails database-design models has-many-through

我确定这已被问过一百万次了。我不是很好。我有以下设置:我有一个有许多事件的教练。每个活动只有一名教师(所有者/创建者)。我想添加一个单独的链接,以允许其他教师关联但仍保留原始教师(所有者)。我有一个粗略的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 ...]

2 个答案:

答案 0 :(得分:1)

ASCII码为2分。

我对Rails一无所知,但是从event表中取出教师外部引用并将is_primary_instructor位字段添加到关联的事件表中会更有意义吗?

答案 1 :(得分:1)

同意Shlomo。

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

所以每个教练都有很多活动,每个活动都有很多教练。但是你必须确定一个指示作为主要指导者。

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

引用主要教师:

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