2013-04-30 40 views
2

說我有一個模型,其中我可能需要在保存前操縱它的一些屬性:before_validation上:保存VS before_save

class User < ActiveRecord::Base 

    attr_accessible :name, :email 

    # before_validation :set_name_from_email, on: :save 
    # OR 
    # before_save :set_name_from_email 

    def set_name_from_email 
    self.name ||= email 
    end 

end 

如果我不得不validates :name, presence: true那麼當然這個會去在before_validation。但是如果有(如現在的代碼所示)沒有影響對象有效性的回調機會,是不是更好地把它放在before_save

似乎更整潔有所有的數據操縱回調在一個或另一個桶,如果代碼修改和回調現在可能會影響效力,但隨後又似乎不好呼叫之類的東西.valid?時不必要的運行回調。

任何強烈的意見?

+1

- 不。沒關係。只要做一些讓你感覺更好的事情。 – 2013-04-30 09:52:45

回答

6

通常我會將所有數據操作放在before_save中,因爲在邏輯上將所有數據操作放在一個位置(保存前)。但是,如果將來要對名稱字段進行驗證(即使數據操作不影響有效性),您應該將數據操作放在before_validation中,因爲您不希望將數據y存儲在您的db同時驗證數據x。

你可以閱讀更多關於此這裏:「任何強烈的意見,無論哪種方式」 http://bashar3a.com/2011/09/02/activerecord-callback-gotchas-before_save-vs-before_validate/

3

由於您沒有實際驗證任何內容,但操縱屬性,您應該使用before_save回調。

自定義驗證方法通常會向模型添加錯誤,並且您的set_name_from_email沒有這樣做。

1

除非要驗證您自己的方法分配給「名稱」的值,則可以同時使用這兩個值。

但是,如果你的方法可能導致一個無效名稱,你應該使用before_validation。