Rails:将记录与未创建该记录的用户相关联

时间:2017-08-31 19:40:03

标签: ruby-on-rails

我有一个用户模型和一个患者模型。患者不是该应用程序的用户。用户基本上是创建患者记录的员工。在某些情况下,创建患者记录的用户也是该患者的医生。在其他情况下,患者的医生可能是一个单独的用户。

我想将患者医生的用户ID保存到患者模型而不是碰巧创建患者的用户。我想象的实现是,我将在表单中有一个下拉字段供用户选择患者的医生,包括选择他们自己的选项。我怎样才能做到这一点?我是否以正确的方式思考这个问题?这是我目前的实施:

class Patient < ApplicationRecord
    belongs_to :user

class User < ApplicationRecord
    has_many :patients

患者控制器

类PatientsController&lt; ApplicationController中

def new
    @patient = current_user.patients.build
end

def create
    @patient = current_user.patients.build(patient_params)
    if @patient.save
        flash[:success] = "Patient Created!"
        redirect_to new_referral_request_path(patient_id: @patient.id)
    else
        Rails.logger.info(@patient.errors.inspect)
        render 'patients/new'
end
end

private

def patient_params
    params.require(:patient).permit(:age, :user_id, insurance_ids: [], gender_ids: [], concern_ids: [], race_ids: [])

end
end

患者的架构:

  create_table "patients", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer  "age"
    t.string   "user_id"
    t.index ["user_id"], name: "index_patients_on_user_id"
  end

我有两个角色:一个是员工,另一个是临床医生。员工用户将成为创造患者的用户。创建患者记录的员工用户可能是也可能不是该特定患者的医生。

class User < ApplicationRecord
  self.inheritance_column = :role
  enum role: { Staff: 0, Clinician: 1}

1 个答案:

答案 0 :(得分:1)

只需向physician型号添加Patient关系:

class Patient < ApplicationRecord
  belongs_to :user
  belongs_to :physician, class_name: 'User'
end

然后修改架构:

create_table "patients", force: :cascade do |t|
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer  "age"
  t.string   "user_id"
  t.integer  "physician_id"
  t.index ["user_id"], name: "index_patients_on_user_id"
  t.index ["physician_id"], name: "index_patients_on_physician_id"
end

提示:如果您的ID是数字,请在integer字段中使用id

(当然,最好通过迁移完成此操作,如果您不知道如何,请参阅this post。)

然后在physician_id中允许params

def patient_params
  params.require(:patient).permit(:age, :user_id, :physician_id, insurance_ids: [], gender_ids: [], concern_ids: [], race_ids: [])
end

最后在表单中添加下拉列表:

<%= form_for(@patient) do |f| %>
  <%= f.select :physician_id, User.all.map { |u| [u.name, u.id] } %>
  ...other fields...
<% end %>

现在您可以同时调用patient.userpatient.physician(可以相同)。