Ассоциация Rails Rich - переписывание в модель ассоциации - PullRequest
4 голосов
/ 12 июля 2011

Предположим, у нас есть три модели ПАЦИЕНТЫ, медсестры и их ассоциативная модель НАЗНАЧЕНИЯ.

На этой неделе все пациенты должны встретиться со своими медсестрами.

У пациента много медсестер, а у медсестры много пациентов. Аналогично, у пациента много посещений, но только по одному на медсестру, а у медсестры много посещений, но только по одному на пациента.

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


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


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

Очевидно, НАЗНАЧЕНИЕ принадлежит как пациенту, так и медсестре.

Тем не менее, я также хочу, чтобы медсестра могла отмечать, появился ли пациент. Я реализовал это в рамках миграции следующим образом:

class CreateAppointments < ActiveRecord::Migration
  def self.up
    create_table :appointments do |t|
      t.references :patient
      t.references :nurse
      t.boolean "present", :default => false
      t.timestamps
    end
    add_index :job_enrollments, ['patient_id', 'nurse_id']
  end

  def self.down
    drop_table :appointments
  end

конец

В консоли я мог создать экземпляр всего и мог сделать следующее:

appt = Appointment.new
patient = Patient.new
nurse = Nurse.new

patient.appointments << appt
nurse.appointments << appt

Теперь возникает вопрос: как мне это реализовать, чтобы медсестра в этом назначении могла изменить значение логического значения на ИСТИНА? Пока что я могу изменить значение экземпляра встречи, набрав:

appt.present = true

Но это не то, что я хочу. Я хочу, чтобы медсестра смогла изменить эту связь и не дать пациенту ничего изменить.

Должен ли я просто не использовать для этого богатые ассоциации?

1 Ответ

2 голосов
/ 10 мая 2012

Я предполагаю, что ваш вопрос о том, как использовать эти ассоциации.После сохранения записи вы можете вызвать и изменить запись о встрече, например, так:

# current_nurse is the nurse using the system and reporting
appt = current_nurse.appointments.where(:patient_id => params[:patient_id]).first
appt.update_attribute :present, true

Чтобы предотвратить доступ пациента к записи и ее изменение, вам потребуется механизм аутентификации, такой как devise.Только тогда предоставьте медсестрам разрешение на доступ к системе.

...