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

时间:2011-07-01 05:47:49

标签: ruby-on-rails ruby-on-rails-3 activerecord associations update-attributes

  

可能重复:
  Rails update_attributes without save?

从根本上说,我想做一个ActiveRecord“update_attributes”,同时让ActiveRecord更改为pending。有没有办法实现这个目标?如果您想知道为什么我会想要这个,请继续阅读。

我有一个由三部分组成的表单:静态部分(彼此独立的文本字段),一组选择(填写条目时增长),以及显示选择对一组的影响的部分依赖对象。更改选择需要往返服务器以确定效果,并且某些选择会影响将来选择的选择。选择被建模为基本模型的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不匹配。 / p>

我可以做一些真正的kludgy并创建一些看起来像ActiveRecord的东西(至少足以满足我的偏见)但我必须认为这是一个很常见的问题,它有一个很好的解决方案。

2 个答案:

答案 0 :(得分:7)

取决于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是模型字段的哈希等。

答案 1 :(得分:4)

以下内容应与update_attributes一样,允许您传递模型属性的子集,而不会清除其他属性,也可以静默忽略散列中的任何未知属性。如果您使用字符串或符号作为哈希键,它也不应该在意。

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