0

我想向模型关联添加另一列,例如参见http://guides.rubyonrails.org/v2.3.11/association_basics.html#the-has-many-through-association现在我有一个新列也需要检查

医生

id
name
organization_id (new one)

约会

id
physician_id
patient_id
organization_id (new one)
appointment_date

耐心

id
name
organization_id (new one)

我的要求是,如果三个表中的任何一个具有不同的组织 ID,则关联应该不起作用。

在控制器中,我使用的是代码:@all_patients = Physician.find_by_id_and_organization_id(params[:id], params[:orgId]).patients

让所有患者都属于医生并在 UI 上显示。在某些脏数据的情况下,表约会和患者可能有不正确的组织 ID。我想要的是 UI 不应该显示 organization_id 不是预期的数据。例如,我在 db 中有数据说:

医生:
1,“医师 1”,1
2,“医师 2”,1

任命
1, 1, 1, 1, 2013-1-1
2, 1, 2, 1, 2013-1-1
3, 1, 3, 1, 2013-1-1
4, 1, 4, 2, 2013- 1-1

患者
1、“患者 1”、1
2、“患者 2”、2
3、“患者 3”、1
3、“患者 4”、1

如果我使用的是 Physician.find_by_id_and_organization_id(1,1).patients,我希望得到以下患者
1,“患者 1”,1
但现在我不知道如何配置模型关系,我得到了整个患者数据。

那么,如何配置模型呢?

4

1 回答 1

0

您不需要在 table 中有额外的列appointments。在您的约会模型中,您只需进行额外的验证回调并确保患者和医生都属于同一组织:

class Appointment < ActiveRecord::Base
   validate :have_to_be_in_the_same_organization

   def have_to_be_in_the_same_organization
      unless Patient.find(patient_id).organization_id == Physician.find(physician_id).organization_id
          errors.add(:base, "The physician and the patient must be in the same organization to create an appointment!")
      end
   end
end

解决方案2:

如果您不希望它呈现任何错误,而是希望将其重定向到某个地方而不尝试创建该约会,您可以在以下位置执行before filter您的create操作appointmentscontroller

class AppointmentsController < ActiveRecord::Base
before_filter :have_to_be_in_the_same_organization, :only => [:create]

  def have_to_be_in_the_same_organization
              unless Patient.find(params[:patient_id]).organization_id == Physician.find(params[:physician_id]).organization_id
                  redirect_to somewhere_path
              end
  end
end
于 2013-04-17T10:27:23.927 回答