验证无法更改任何属性

时间:2015-04-27 22:38:41

标签: ruby-on-rails-4 activerecord

我有一个“不可变”类,它需要保持这种方式用于记录/记帐目的。

如何确保没有人更新此型号上的任何列? 我看过https://stackoverflow.com/a/14781183/902907,这是一个很好的逐列解决方案,但我想为每一列做到这一点。

我想避免使用read_only_attributes,因为那些失败的时候太安静了。

1 个答案:

答案 0 :(得分:1)

怎么样:

class JournalEntry < ActiveRecord::Base
  before_update { fail ActiveRecord::ReadOnlyRecord }
end

这将允许创建新的日记帐分录,但如果您尝试保存,则会失败。

j = JournalEntry.new
j.amount = "21.85"
j.save
# => true
j.amount = "39.00"
j.save
# => ActiveRecord::ReadOnlyRecord

或者,此方法使用ActiveRecord提供的readonly!方法:

class JournalEntry < ActiveRecord::Base
  after_initialize { readonly! if persisted? }
  after_create { readonly! }
end

但是,这两种技术都有一个缺点:它们不会阻止您使用低级调用来改变数据库。例如,绕过验证和回调的update_column将打败这些只读检查。