使用Devise Gem的项目中,如何在Note模型判断创建者为医生或患者?
怎么判断Note是医生还是患者创建的?
嘿,这个场景我之前做医疗类项目时刚好碰到过,结合你用Devise的情况,给你分享两种靠谱的解决方案:
首先得先明确咱们的模型关联逻辑哈,常规的设计应该是这样的:
User模型用Devise生成,一般会加个role字段(字符串类型,存"doctor"或者"patient");Appointment关联两个User:belongs_to :doctor, class_name: "User"和belongs_to :patient, class_name: "User";Note则关联创建它的用户和对应的预约:belongs_to :user、belongs_to :appointment。
方案一:直接用User的角色判断(简单直接)
如果你的User模型已经有role字段了,那在Note里加两个方法就行:
# app/models/note.rb class Note < ApplicationRecord belongs_to :user belongs_to :appointment # 判断是不是医生创建的 def created_by_doctor? user.role == "doctor" end # 判断是不是患者创建的 def created_by_patient? user.role == "patient" end end
用的时候就很顺手:
note = Note.find(1) note.created_by_doctor? # 直接返回true或false note.created_by_patient? # 同理
方案二:结合预约关联判断(更严谨)
要是担心角色字段可能被误改,或者想确保创建笔记的人确实是这个预约里的医生/患者,那可以结合Appointment的关联来验证:
# app/models/note.rb class Note < ApplicationRecord belongs_to :user belongs_to :appointment def created_by_doctor? user == appointment.doctor end def created_by_patient? user == appointment.patient end end
这种方式更安全,因为它不仅看角色,还确认了这个用户就是当前预约的参与方,避免了角色正确但不属于该预约的情况。
额外小建议:加个验证防止非法创建
为了避免有人乱创建不属于自己的笔记,还可以在Note模型里加个验证:
# app/models/note.rb validate :only_appointment_participants_can_create_note private def only_appointment_participants_can_create_note unless user == appointment.doctor || user == appointment.patient errors.add(:user, "只有该预约的医生或患者才能创建笔记哦") end end
这样就能从根源上杜绝非法笔记的创建啦!
内容的提问来源于stack exchange,提问作者Saura Mandal
相关产品推荐
相关产品推荐

