我使用文本列和rails的存储来记录用户偏好,如下所示:
class User
store :prefs, accessors: [:dismiss_setup, :initiate_setup]
after_initialize :set_defaults
private
def set_defaults
self.dismiss_setup ||= false
self.initiate_setup || = false
end
end
当然,这看起来像这样:
#<User id: 13, prefs: {"dismiss_setup"=>false, "initiate_setup"=>"false"} ...
在开发过程中,随着工作流的改进,我已经多次更改了这些访问器。我不知道如何从prefs散列中自动清除它们。我最终得到了很多现在不赞成的键/值,像这样:
#<User id: 13, prefs: {"dismiss_setup"=>false, "initiate_setup"=>"false", "something_old"=>"true", "no_longer_used"=>"true"} ...
我想在将来进行更改,但不要弄乱Users表。是否有一种方法来比较prefs哈希与我当前的存储访问器和删除任何不存在的?或者换个角度看问题?
我是这么想的:
class User
store :prefs, accessors: [:dismiss_setup, :initiate_setup]
after_initialize :clean_up, :set_defaults
def array_of_prefs
self.class.name.constantize.stored_attributes[:prefs]
end
private
def clean_up
a = self.array_of_prefs.map &:to_s
self.prefs.keep_if { |k,v| a.include? k }
end
def set_defaults
self.dismiss_setup ||= false
self.initiate_setup ||= false
end
end
作为奖励,@user。Array_of_prefs可以与用户控制器中的其他强参数合并。