Ruby on rails Rails是否在不保存的情况下更新_属性?
是否有不保存记录的Ruby on rails Rails是否在不保存的情况下更新_属性?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Rails Activerecord,是否有不保存记录的update\u attributes替代方法 所以我可以这样做: @car = Car.new(:make => 'GMC') #other processing @car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it") #other processing @
update\u attributes
替代方法
所以我可以这样做:
@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save
顺便说一句,我知道我可以
@car.model='Sierra'
,但我想在一行中更新它们。您可以使用'attributes'方法:
@car.attributes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'}
资料来源:
属性=(新属性、保护属性=真)
允许您通过传入一个哈希值,该哈希值中的键与属性名匹配(这同样与列名匹配),一次设置所有属性
如果guard_protected_attributes为true(默认值),则可以使用attr_protected宏保护敏感属性不受这种形式的质量分配的影响。或者,您也可以指定可以使用attr_ACCESS宏访问哪些属性。然后,不允许对未包含在其中的所有属性进行质量分配
class User < ActiveRecord::Base
attr_protected :is_admin
end
user = User.new
user.attributes = { :username => 'Phusion', :is_admin => true }
user.username # => "Phusion"
user.is_admin? # => false
user.send(:attributes=, { :username => 'Phusion', :is_admin => true }, false)
user.is_admin? # => true
class用户'Phusion',:is_admin=>true}
user.username#=>“Phusion”
user.is#u admin?#=>假的
send(:attributes=,{:username=>'Phusion',:is_admin=>true},false)
user.is#u admin?#=>真的
我相信您正在寻找的是
它与update_属性基本相同,但不保存记录:
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :name, :is_admin, :as => :admin
end
user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }) # Raises an ActiveModel::MassAssignmentSecurity::Error
user.assign_attributes({ :name => 'Bob'})
user.name # => "Bob"
user.is_admin? # => false
user.new_record? # => true
class用户:admin
结束
user=user.new
user.assign_attributes({:name=>'Josh',:is_admin=>true})#引发ActiveModel::MassAssignmentSecurity::Error
user.assign_属性({:name=>'Bob'})
user.name#=>“Bob”
user.is#u admin?#=>假的
user.new#u记录?#=>真的
您可以使用分配属性
或属性=
(它们是相同的)
更新方法备忘单(适用于Rails 6):
=更新
+分配属性
保存
=分配属性的别名attributes=
=已弃用,update\u属性
update的别名
另一张备忘单:
要在不保存的情况下为ActiveRecord模型大量分配值,请使用
assign\u attributes
或attributes=
方法。这些方法在Rails 3和更新版本中可用。但是,有一些细微的差异和与版本相关的问题需要注意
这两种方法都遵循以下用法:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
请注意,这两个方法都不会执行验证或执行回调;调用save
时将发生回调和验证
轨道3
attributes=
与Rails 3中的assign\u attributes
略有不同attributes=
将检查传递给它的参数是否是散列,如果不是,则立即返回<代码>分配属性没有这样的哈希检查。看
以下无效代码只需返回而不设置属性,就会以静默方式失败:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
将默默地执行,就好像分配成功了一样,而实际上没有成功
当assign\u attributes
尝试对封闭数组的哈希键进行字符串化时,此无效代码将引发异常:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
将为stringify_key
引发NoMethodError
异常,表明第一个参数不是散列。异常本身并不能提供关于实际原因的信息,但异常确实发生的事实非常重要
这些情况之间的唯一区别是用于批量分配的方法:attributes=
以静默方式成功,而assign\u attributes
引发异常以通知发生了错误
这些示例可能看起来是人为的,并且在一定程度上是人为的,但是当从API转换数据时,或者仅仅使用一系列数据转换而忘记对最终的.map
的结果进行哈希[]
时,很容易发生此类错误。在上面维护一些代码50行,并从属性赋值中删除3个函数,那么您就有了失败的秘诀
Rails 3的教训是:始终使用assign\u attributes
而不是attributes=
轨道4
在Rails 4中,attributes=
只是assign\u attributes
的别名。看
对于导轨4,两种方法均可互换使用。未能将哈希作为第一个参数传递将导致一个非常有用的异常:ArgumentError:在分配属性时,必须将哈希作为参数传递。
验证
如果您正在为保存
准备飞行前作业,您可能也会对保存前验证感兴趣。您可以为此使用valid?
和invalid?
方法。两者都返回布尔值<代码>有效?如果未保存的模型通过所有验证,则返回true;如果未通过验证,则返回false<代码>无效?只是有效?
有效?
可以这样使用:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
这将使您能够在调用
save
之前处理任何验证问题,您说的“不保存记录”是什么意思?更新\u属性将模型保存到数据库中。我想知道是否有一种类似的方法不适用于非破坏性方法。有关详细信息,请参阅您可以使用更新列(名称、值)更新对象的单个属性,而无需调用保存。1.跳过验证。2.将跳过回调。3.如果该列可用,则不会更新该列的更新位置/更新位置。对于3.1+,使用assign_attributes
您的示例有点误导,因为您没有从模型中粘贴这行:attr_accessible:is_admi