0
我有一个“不可变”的类,它需要保持这种方式进行日志记录/会计目的。确认没有属性可以更改
如何确保没有人更新此型号上的任何列? 我看过https://stackoverflow.com/a/14781183/902907,这是一个很好的逐列解决方案,但我想为每一列都做这件事。
我想避免read_only_attributes,因为这些失败太安静。
我有一个“不可变”的类,它需要保持这种方式进行日志记录/会计目的。确认没有属性可以更改
如何确保没有人更新此型号上的任何列? 我看过https://stackoverflow.com/a/14781183/902907,这是一个很好的逐列解决方案,但我想为每一列都做这件事。
我想避免read_only_attributes,因为这些失败太安静。
如何:
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
将打败这些只读检查。