Ruby on rails 如何在不实际保存更改的情况下完成属性更新
可能重复:Ruby on rails 如何在不实际保存更改的情况下完成属性更新,ruby-on-rails,ruby-on-rails-3,activerecord,associations,update-attributes,Ruby On Rails,Ruby On Rails 3,Activerecord,Associations,Update Attributes,可能重复: 从根本上说,我希望在保持ActiveRecord更改挂起的同时执行ActiveRecord“更新\u属性”。有没有办法做到这一点?如果你想知道我为什么想要这个,请继续阅读 我有一个由三部分组成的表单:静态部分(文本字段相互独立)、一组选择(随着条目的填充而增长),以及一个显示选择对一组依赖对象的影响的部分。更改选择需要往返服务器以确定效果,并且某些选择会影响未来选择的选择。这些选择被建模为基本模型中的多个关联。例如:(注意,[]项表示HTML选择) 我已经将表单设置为典型的嵌套属性
从根本上说,我希望在保持ActiveRecord更改挂起的同时执行ActiveRecord“更新\u属性”。有没有办法做到这一点?如果你想知道我为什么想要这个,请继续阅读 我有一个由三部分组成的表单:静态部分(文本字段相互独立)、一组选择(随着条目的填充而增长),以及一个显示选择对一组依赖对象的影响的部分。更改选择需要往返服务器以确定效果,并且某些选择会影响未来选择的选择。这些选择被建模为基本模型中的多个关联。例如:(注意,[]项表示HTML选择) 我已经将表单设置为典型的嵌套属性表单。当选择被更改时,我用AJAX发回字段,这样我就得到了典型的params散列(例如params[:basemodel][associated_models_attributes][0][:field_name])。我想把它放到一个未保存的ActiveRecord中,这样我已经用来生成原始页面部分的部分就可以用来生成JS响应(我使用了一个JS.erb文件)。使用Basemodel.new(params[:Basemodel])会给出错误
"ActiveRecord::RecordNotFound (Couldn't find AssociatedModel with ID=1 for Basemodel with ID=)
这是发生的(我想),因为来自现有关联记录的ID(在当前记录中有非空ID)与从“新”调用生成的空ID不匹配。
我可以做一些非常笨拙的事情,创建一些看起来像ActiveRecord的东西(至少足够像它来满足我的部分要求),但我不得不认为这是一个非常常见的问题,有一个很好的解决方案 取决于ActiveRecord::Persistence#update_属性的来源
# File activerecord/lib/active_record/persistence.rb, line 127
def update_attributes(attributes)
# The following transaction covers any possible database side-effects of the
# attributes assignment. For example, setting the IDs of a child collection.
with_transaction_returning_status do
self.attributes = attributes
save
end
end
可以使用为模型指定属性
model.attributes = attributes
其中属性是模型字段等的散列。以下内容应与
更新\u属性
一样,允许您传递模型属性的子集,而无需清除其他属性,也可以自动忽略散列中的任何未知属性。如果您使用字符串或符号作为哈希键,它也不应该在意
def set_attributes (attributes)
attributes.each do |key, value|
self.send("#{key}=", value) if self.respond_to?("#{key}=")
end
end
我认为这可能会奏效,但请看下一个答案,以获得更优雅的解决方案。谢谢你的回复。工作很有魅力。谢谢下次在发布之前,我将查看源代码。您可以使用update_column(名称、值)更新对象的单个属性,而无需调用save。1.跳过验证。2.将跳过回调。3.如果该列可用,则不会更新该列的更新位置/更新位置。对于3.1+,使用
assign\u属性
def set_attributes (attributes)
attributes.each do |key, value|
self.send("#{key}=", value) if self.respond_to?("#{key}=")
end
end