attributes_with_quotes函数的参数搞这么复杂,原因是我想即便是用这段代码替换库里面的部分,也不影响原有代码的正常功能。
可以简单测试一下上面的例子,它生成的SQL语句会简洁很多,大概是这样子:
UPDATE orders SET "status" = 'finished' WHERE id = 1
已发现的BUG和修复:
1、没有调用validation (by cookoo)。由于原有代码调用save,而save被覆盖成有验证的代码,所以具有验证功能。解决办法是增加一段代码:
module ActiveRecord
module ValidationsFix
def
self.append_features(base)
#
:nodoc:
super
base.class_eval do
alias_method :update_attributes_without_validation, :update_attributes
alias_method :update_attributes, :update_attributes_with_validation
end
end
def
update_attributes_with_validation(new_attributes)
return
if
new_attributes.nil?
attributes = new_attributes.dup
attributes.stringify_keys!
self.attributes
=
attributes
if
valid?
update_attributes_without_validation(attributes)
else
return
false
end
end
end
end
ActiveRecord::Base.class_eval do
include ActiveRecord::ValidationsFix
end
简单测试通过。