从rails存储哈希中删除孤立的键/值

时间:2014-06-24 18:43:13

标签: ruby-on-rails ruby-on-rails-4

我正在使用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散列与我当前的商店访问器并删除任何不存在的?或者也许是另一种看待问题的方法?

1 个答案:

答案 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可以与用户控制器中的其他强参数合并。保持一切动态。