我有一个用户模型和一个患者模型。患者不是该应用程序的用户。用户基本上是创建患者记录的员工。在某些情况下,创建患者记录的用户也是该患者的医生。在其他情况下,患者的医生可能是一个单独的用户。
我想将患者医生的用户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}
答案 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.user
和patient.physician
(可以相同)。