假设我有一个模型,在保存它之前,我可能需要操作它的一些属性:
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?之类的东西时运行不必要的回调似乎不太好。
无论哪种方式,有什么强烈的意见吗?
发布于 2013-04-30 18:04:25
通常,我会将所有数据操作放在before_save中,因为将所有数据操作放在一个位置(在保存之前)是符合逻辑的。
但是,如果将来要对name字段进行验证(即使数据操作不会影响有效性),也应该将数据操作放在before_validation中,因为您不希望在验证数据x时将数据y存储在数据库中。
你可以在这里阅读更多信息:http://bashar3a.com/2011/09/02/activerecord-callback-gotchas-before_save-vs-before_validate/
发布于 2013-04-30 17:58:06
因为您实际上并没有验证任何东西,而是在操作一个属性,所以您应该使用before_save回调。
自定义验证方法通常会向模型添加错误,而您的set_name_from_email不会这样做。
发布于 2013-04-30 18:00:07
除非您想要验证您自己的方法分配给“”的值,否则您可以同时使用这两种方法。
但是,如果您的方法可能导致无效的名称,则应该使用before_validation。
https://stackoverflow.com/questions/16296448
复制相似问题