我正在尝试使用关注角色特定方法在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' })
...首先处理角色更改,然后更新属性。
答案 0 :(得分:0)
猜测可以部分删除所有方法:
Module.instance_methods.each{|m|
undef_method(m)
}