我正在使用text column和rails'store来记录用户首选项,如下所示:
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散列与我当前的商店访问器并删除任何不存在的?或者也许是另一种看待问题的方法?
答案 0 :(得分:0)
以下是我提出的建议:
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可以与用户控制器中的其他强参数合并。保持一切动态。