Связать две таблицы вместе, используя has_many и has_one? - PullRequest
1 голос
/ 15 сентября 2010

Я уверен, что об этом уже миллион раз. Я просто не очень хорошо ищу. У меня есть следующие настройки: у меня есть инструктор, который имеет много событий. Каждое событие имеет только один инструктор (владелец / создатель). Я хочу добавить отдельную связь, чтобы позволить другим инструкторам быть связанными, но при этом сохранить первоначального инструктора (владельца). У меня есть грубое представление ASCII, но я не могу понять, как это сделать в модели рельсов.

                ,-------------------.
                | 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 ]

1 голос
/ 15 сентября 2010

Согласен со Шломо.

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

1 голос
/ 15 сентября 2010

2 балла за ASCII.

Я ничего не знаю о Rails, но было бы более разумным убрать внешнюю ссылку инструктора из таблицы event и добавить is_primary_instructorбитовое поле для таблицы связанных событий?

...