要将值批量分配给ActiveRecord模型而不保存,请使用assign_attributes
或attributes=
方法。这些方法在Rails 3和更高版本中可用。但是,需要注意一些细微的差异以及与版本相关的陷阱。
两种方法都遵循这种用法:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
注意,这两种方法都不会执行验证或执行回调。回调和验证将在save
被调用时发生。
导轨3
attributes=
与assign_attributes
Rails 3 略有不同。 attributes=
将检查传递给它的参数是否为哈希,如果不是,则立即返回;否则返回false。assign_attributes
没有这种哈希检查。请参阅ActiveRecord属性分配API文档attributes=
。
以下无效代码将通过仅返回而不设置属性而静默失败:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
会默默地表现出分配已成功完成的事实,但实际上并非如此。
当assign_attributes
试图对封闭数组的哈希键进行字符串化时,此无效代码将引发异常:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
将引发的NoMethodError
异常stringify_keys
,指示第一个参数不是哈希。异常本身并不能很好地说明实际原因,但是异常确实发生的事实非常重要。
这些情况之间的唯一区别是用于批量分配的方法:attributes=
默默地成功,并assign_attributes
引发异常以通知已发生错误。
这些示例在一定程度上看似是人为的,但是当从API转换数据时,甚至只是使用一系列数据转换而忘Hash[]
了final的结果时,都容易发生这种类型的错误.map
。保持上面的50行代码和从属性分配中删除的3个功能,您将获得失败的秘诀。
Rails 3的课程是:始终使用assign_attributes
代替attributes=
。
滑轨4
在Rails 4中,attributes=
只是的别名assign_attributes
。请参阅ActiveRecord属性分配API文档attributes=
。
对于Rails 4,这两种方法都可以互换使用。未能将哈希作为第一个参数传递将导致非常有用的异常:ArgumentError: When assigning attributes, you must pass a hash as an argument.
验证方式
如果您正在准备准备之前的飞行任务save
,那么您可能也有兴趣在保存之前进行验证。您可以使用valid?
和invalid?
方法。两者都返回布尔值。 valid?
如果未保存的模型通过所有验证,则返回true;否则,返回false。 invalid?
简直是valid?
valid?
可以这样使用:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
这将使您能够在调用之前处理任何验证问题save
。