Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在不实际保存更改的情况下完成属性更新_Ruby On Rails_Ruby On Rails 3_Activerecord_Associations_Update Attributes - Fatal编程技术网

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