class User
# 有name, type_id
TYPE_ID = {admin: 1 , user: 2 }
# 用了 enumerize 这个gem
extend Enumerize
enumerize :type_id, :in => TYPE_ID , predicates: { prefix: true }
end
user = User.find(1)
# 引用gem后的变化
user.type_id = 'admin'
user.type_id_value = 1
# 现在的结果
user.attributes = {'id'=>1, 'name'=>'张三', 'type_id'=>'admin'}
# 期望的结果
user.attributes = {'id'=>1, 'name'=>'张三', 'type_id'=>1}
#暂时的办法,在当前类改写方法
# 不改写底层方法是怕影响其他
def attributes
old_attributes = super
old_attributes.each do |k, v|
real_value = self.try([k, '_value'].join.to_sym)
old_attributes.update(k=>real_value) unless real_value.nil?
end
old_attributes
end
我翻过 gem 相关的文档https://www.rubydoc.info/gems/enumerize/2.3.1 ,暂时没找到这方面的设置,源码有些看的不懂,希望大家给下解决建议。。。
出现此问题主要是原本项目是 rails4 相应的 gem 的版本比较旧,所以当时是没有问题的,不会改写 attributes 升级 rails5 和 gem 后就出问题了。。。