使用关注点通过角色扩展用户模型



我正在尝试使用特定于角色的方法在Rails中构建基于角色的数据结构。我已经探索了其他解决方案,如STI,多态关联,但选择尝试这种方法。

所描述的所有属性都存储在一个表中,即用户。

module Client
   extend ActiveSupport::Concern
   def self.extended(target)
     target.class_eval do
         validates :emergency_contact, presence: true
     end
   end
end
module Doctor
   def self.extended(target)
     target.class_eval do
         validates :credentials, presence: true  
     end
   end
end
class User < ApplicationRecord
   validates :role, allow_blank: true, inclusion: { in: roles }
   validates :first_name, presence: true
   validates :last_name, presence: true
   validates :email, presence: true
   after_initialize { extend_role }
   # Extend self with role-appropriate Concern
   def extend_role
      extend role.camelize.constantize if role
   end
   def role=(role)
      super(role)
      extend_role
   end
end

我面临的挑战是在更改角色期间,具体来说,可以做些什么(如果有的话)来否定前一个角色扩展用户的关注点?

每个用户将

有 1 个角色,因此将客户和医生关注点混合到用户中是不合适的(至少此时)。

在理想的解决方案中,User 实例将随着角色的变化而变形,并保留所有更改的属性。

所以,称之为:

user.update_attributes({ first_name: 'Wily', last_name: 'McDoc', role: 'doctor' })

。将首先处理角色更改,然后更新属性。

猜测可以部分删除所有方法:

Module.instance_methods.each{|m|
  undef_method(m)
}

另外,我如何反转红宝石的包含功能,以防可能感兴趣

最新更新