覆盖ActiveRecord属性getter不会产生一致的结果

时间:2016-10-19 22:01:32

标签: ruby-on-rails

我有一个属性priority,它以整数形式存储在数据库中。我将它们映射到特定值:

  PRIORITY = {
      high:1,normal:2,low:3
  }

当我想访问阅读器时,我将其覆盖:

  def priority
    PRIORITY.key(read_attribute(:priority))
  end

我的问题是,当我想检查是否有任何属性值已更改并且我调用changes方法时,我得到以下结果:

task.changes
 => {"priority"=>[2, :high]} 

对于原始值,它采用数据库值。对于更改的值,它将获取getter访问器值的结果。这是不一致的。

如何使changes调用始终如一?

1 个答案:

答案 0 :(得分:1)

您可能想尝试在模型中使用枚举,如下所示:

enum priority: { high: 1, normal: 2, low: 3}

请参阅此处的文档http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html