我刚刚阅读了以下两个问题的答案:如何更改即将保存的对象(在模型中)的参数?
1)
class User < ActiveRecord::Base
def username=(val)
write_attribute(:username, val.downcase)
end
end
2)
before_save do
self.username = self.username.downcase
end
有人可以评估一种解决方案是否因为各种原因而“更好”?或者它们可以被认为是“相同的”吗?
谢谢你们!
答案 0 :(得分:1)
一个区别在于,在选项(1)中,一旦分配了username属性,它就会小写,而使用选项(2),在保存记录之前不会转换它。因此,如果username的值影响保存之前发生的其他步骤,则选项(1)可能更好。
此外,我发现选项(1)在可读性/可维护性方面更好,因为很明显代码直接与用户名的分配相关。在选项(2)中,这有点隐含。
旁注:您应该检查nil,因为如果为username分配了一个nil值(由于在nil上调用downcase
),上面的代码将导致错误:
class User < ActiveRecord::Base
def username=(val)
val = val.downcase unless val.nil?
write_attribute(:username, val)
end
end