我正在構建一個Rails 3.2應用程序,我必須將Sidekiq作業封裝在一個單獨的模型中,以維護關係並處理插入和刪除操作。mongoid不可改變的記錄
我使用Mongoid作爲我的主要ORM,我想請問我怎樣才能使一成不變的記錄。
這意味着,在(intialization和)創造就業機會的,沒有變化是可以接受的,但刪除記錄。
謝謝!
我正在構建一個Rails 3.2應用程序,我必須將Sidekiq作業封裝在一個單獨的模型中,以維護關係並處理插入和刪除操作。mongoid不可改變的記錄
我使用Mongoid作爲我的主要ORM,我想請問我怎樣才能使一成不變的記錄。
這意味着,在(intialization和)創造就業機會的,沒有變化是可以接受的,但刪除記錄。
謝謝!
假設你的Rails應用程序是唯一的MongoDB的客戶端,您可以在模型層實現你的永恆的邏輯:
class Job
include Mongoid::Document
before_validation { false if changed? && persisted? }
end
當您第一次在一個新的Job
致電save
或create
,數據將成功地堅持。當您致電save
時,對象的進一步更改將不會寫入數據庫。 delete
的行爲將不受影響。
爲什麼這個工程
before_validation
取消持久如果返回false:
如果before_validation回調的返回值進行評估,以虛假的,該過程將被中止和基地#保存將返回false。如果ActiveRecord :: Validations#保存!被調用它會引發一個ActiveRecord :: RecordInvalid異常。什麼都不會被附加到錯誤對象。
方法參考
changed?返回true,如果任何字段髒
persisted?返回true,如果此對象的某些版本保存在數據庫中
我對Se進行了擴展巴斯蒂安的excellent answer使行爲更清晰。
class Job
include Mongoid::Document
field :msg, type: String
validate :immutability
def immutability
if changed? && persisted?
errors[:base] << "#{self.class.name} is immutable and cannot be modified after it has been persisted"
end
end
end
這是它如何工作的:
> job = Job.create(msg: 'Hello')
=> #<Job _id: 55a7ccb76d61634e87000000, msg: "Hello">
> job.update_attributes!(msg: 'Goodbye')
Mongoid::Errors::Validations:
Problem:
Validation of Job failed.
Summary:
The following errors were found: Job is immutable and cannot be modified after it has been persisted
Resolution:
Try persisting the document with valid data or remove the validations.
from /...
> job.destroy!
=> true
這有兩個主要優點:
before_validation
(Calling update_attributes! on Job resulted in a false return from a callback.
)
謝謝你的回答塞巴斯蒂安! –