before_validation,on :: save vs before_save

Rob*_*ton 2 activerecord ruby-on-rails

假设我有一个模型,我可能需要在保存之前操纵它的一些属性:

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
Run Code Online (Sandbox Code Playgroud)

如果我必须validates :name, presence: true那么当然这将不得不进入before_validation.但是如果有(现在的代码就是这样)回调没有影响对象有效性的可能性,那么把它放进去更好before_save吗?

如果代码发生变化并且回调现在可能影响有效性,那么让所有数据在一个或另一个桶中操纵回调似乎更为简洁,但是当调用类似的东西时再次运行回调似乎很糟糕.valid?.

任何强烈的意见?

Yeh*_*rov 6

通常我会将所有数据操作放在中,before_save因为在一个地方(保存之前)进行所有数据操作是合乎逻辑的.

但是,如果您将来在名称字段上进行验证(即使数据操作不影响有效性),您应该将数据操作放在a中before_validation,因为您不希望在验证数据x时在数据库中存储数据y .

你可以在这里阅读更多相关信息:http: //bashar3a.com/2011/09/02/activerecord-callback-gotchas-before_save-vs-before_validate/