2013-01-15 46 views
1

我正在構建一個Rails 3.2應用程序,我必須將Sidekiq作業封裝在一個單獨的模型中,以維護關係並處理插入和刪除操作。mongoid不可改變的記錄

我使用Mongoid作爲我的主要ORM,我想請問我怎樣才能使一成不變的記錄。

這意味着,在(intialization和)創造就業機會的,沒有變化是可以接受的,但刪除記錄。

謝謝!

回答

1

假設你的Rails應用程序是唯一的MongoDB的客戶端,您可以在模型層實現你的永恆的邏輯:

class Job 
    include Mongoid::Document 
    before_validation { false if changed? && persisted? } 
end 

當您第一次在一個新的Job致電savecreate,數據將成功地堅持。當您致電save時,對象的進一步更改將不會寫入數據庫。 delete的行爲將不受影響。

爲什麼這個工程

before_validation取消持久如果返回false:

如果before_validation回調的返回值進行評估,以虛假的,該過程將被中止和基地#保存將返回false。如果ActiveRecord :: Validations#保存!被調用它會引發一個ActiveRecord :: RecordInvalid異常。什麼都不會被附加到錯誤對象。

方法參考

  1. changed?返回true,如果任何字段髒

  2. persisted?返回true,如果此對象的某些版本保存在數據庫中

+0

謝謝你的回答塞巴斯蒂安! –

0

我對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 

這有兩個主要優點:

  1. 錯誤消息是更說明不是你before_validationCalling update_attributes! on Job resulted in a false return from a callback.
  2. 得到什麼
  3. 它遵循Mongops關於not using callbacks for domain logic的建議:對域日誌使用回調ic是一個糟糕的設計實踐,並且可能導致意外的錯誤,當鏈中的回調暫停執行時,這些錯誤難以調試。我們建議僅將它們用於交叉問題,如排隊後臺工作。