从rails存储散列中删除孤立的键/值



我使用文本列和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可以与用户控制器中的其他强参数合并。

最新更新