利用关注来扩展具有角色的用户模型

时间:2016-02-18 14:58:59

标签: ruby-on-rails user-roles ruby-on-rails-5

我正在尝试使用关注角色特定方法在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' })

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

1 个答案:

答案 0 :(得分:0)

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

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

How can I reverse ruby's include function,如果可能感兴趣