ruby on rails-如何在不实际保存更改的情况下完成update_attributes



可能重复:
Rails是否更新属性而不保存?

从根本上讲,我想在保留ActiveRecord更改的同时执行ActiveRecord"update_attributes"。有办法做到这一点吗?如果你想知道我为什么想要这个,请继续阅读。

我有一个由三部分组成的表单:一个静态部分(文本字段相互独立),一组选择(随着条目的填充而增长),以及一个显示选择对一组相关对象的影响的部分。更改选择需要往返服务器以确定效果,其中一些选择会影响将来的选择。选择被建模为基本模型中的has_many关联。例如(注意[]条目指定HTML SELECTs)

Include [section]
  Exclude [subsection]
  Exclude [subsection]
Include [section]
  Exclude [subsection]
...

我已经将表单设置为典型的嵌套属性表单。当选择发生更改时,我会使用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_attributes

# 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

其中attributes是模型字段等的散列。

以下内容应该与update_attributes一样,允许您在不清除其他属性的情况下传递模型属性的子集,并静默地忽略哈希中的任何未知属性。它也不应该关心您是否使用字符串或符号作为哈希键。

def set_attributes (attributes)
  attributes.each do |key, value|
    self.send("#{key}=", value) if self.respond_to?("#{key}=")
  end
end

相关内容

  • 没有找到相关文章

最新更新