Как заполнить поля в has_many через таблицу соединений - PullRequest
8 голосов
/ 23 августа 2011

У меня есть вопрос, касающийся активного связывания записей со ссылкой на эту часть документации по рельсам:

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

если у нас есть три модели:

class Physician < ActiveRecord::Base
  has_many :appointments
  has_many :patients, :through => :appointments
end

class Appointment < ActiveRecord::Base
  belongs_to :physician
  belongs_to :patient
end

class Patient < ActiveRecord::Base
  has_many :appointments
  has_many :physicians, :through => :appointments
end

В документации сказано, что коллекцией моделей соединений можно управлять через API следующим образом:

physician.patients = patients

но что, если в модели встреч, как в связанном примере, есть поле с названием назначением / датой, и я хочу создать новую встречу, назначенную врачу и пациенту на определенную дату? Следующий код создаст запись в таблице назначений, но как заполнить назначение_дата тоже на третьем шаге?

physician = Physician.first
patient = Patients.first
physician.patients << patient

существует ли что-то подобное?

physician.patients.create( :patient => patient, 'appointment.appointment_time' => appointment_time ) 

Ответы [ 2 ]

4 голосов
/ 14 июня 2012

старый вопрос, но на него следует ответить - хотя вы можете назначить напрямую physician.patients с помощью метода <<, он создает встречу без значений, которые могут быть или не быть действительными в зависимости от бизнес-правил. Таким образом, более обычным способом создания ассоциации будет назначение встречи на одном из них

demento = Physician.find_by_name('Dr. Demento'}
patient = Patient.new { :name => 'Mrs. Holloway' }
patient.appointments << Appointment.new { :physician => demento, :appointment_time => appt_time }

Вы можете комбинировать строки 2 и 3, если вы склонны.

строка в документах, на которые вы ссылаетесь

physician.patients = patients

Я думаю, что узкий вариант использования этого мог бы быть, если у Дементо было 7 пациентов, но он потерял миссис Холлоуэй из-за неудачного инцидента с экспериментом с лучом смерти, то вы могли бы сделать это с обновленным списком из 6 существующих пациентов и их назначения будут сохранены, и прошлые назначения миссис Холлоуэй будут автоматически удалены (чтобы стереть любую запись здесь, по соображениям страхования ответственности? только Дементо был бы таким подлым).

2 голосов
/ 25 августа 2011

Вы хотите рассмотреть вложенные маршруты, например,

resources :physicians do
  resource :patients
end

Вы можете использовать такие вещи, как form_for(@physician, @patient)

и URL как physician/1/patient/23

для обновления пациента в контексте врача.

...