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
將打敗這些只讀檢查。