2011-07-12 92 views
4

假设我们有三个模型患者,护士和他们的关联模型APPOINTMENTS。Rails Rich Association - 覆盖到关联模型

本周所有患者都必须与他们的护士见面。

患者有许多护士,护士有许多患者。同样,患者有许多预约,但每位护士只有一位,护士有许多预约,但每位患者只有一位。

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 

现在,这里说到问题:我如何实现它,以便该约会中的护士能够将布尔值的值编辑为TRUE?到目前为止,我可以通过键入更改约会的实例的值:

appt.present = true 

但是,这不是我想要的。我希望护士能够修改这种关联,并锁定患者改变任何事情。

我应该不使用丰富的协会呢?

回答

2

我假设你的问题是关于如何使用这些关联。你可以调用和修改约会记录预约保持后,像这样:

# 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。然后只授予护士访问系统的权限。