Rails自动保存不保存对关联的更改

Posted

技术标签:

【中文标题】Rails自动保存不保存对关联的更改【英文标题】:Rails autosave not saving changes to associations 【发布时间】:2020-01-21 12:29:53 【问题描述】:

我正在尝试执行以下操作以使用自动保存更改父关联和子关联,但没有成功。

@child = @parent.childs.last
if child's attribute satisfies some condition
  @parent.something = "asd"
  @child.something = params[:something]
end

@parent.save

这只会保存对父级所做的更改。有没有办法只用一次“保存”调用来保存这两项更改?

【问题讨论】:

您是否为孩子设置了自动保存选项? belongs_to :parent, autosave: true 不,我必须这样做吗? 我无法找到默认设置,但我想设置此选项应该可以满足您的需求。文档:guides.rubyonrails.org/… 我认为该选项是在父级上设置的。文档:api.rubyonrails.org/classes/ActiveRecord/… 你是对的,你需要为你的情况在父级上设置它,大多数关联类型都支持该选项。 【参考方案1】:

如何保存父对象并创建回调after_save 写入更新其子对象的逻辑?

类似:

after_save :update_children

  def update_children
    children.update_all(something: something else)
  end

【讨论】:

我更新了问题。对孩子的改变来自params,我只需要改变一个,而不是所有孩子。【参考方案2】:

默认情况下,只会自动保存新的关联记录。您需要通过将选项传递给关联来启用自动保存机制,请参阅https://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html

class Parent
  has_many :children, autosave: true
end

请注意,这只适用于一种方式,如果您希望保存父母,当您保存孩子时,您需要相反

class Child
  belongs_to: parent, autosave: true
end

这仅在 Rails 知道您正在处理关联时才有效。调用 @parent.childs.last 会返回一个简单的 Child 类实例。所以需要显式保存。

【讨论】:

这就是我所做的。 has_many:儿童,自动保存:真。但它不会保存对孩子所做的更改。 您确定您的应用程序执行if 块? 是的,对父级的更改已保存。 好的,所以问题是,当您在childs 上调用last 时,它不再是ActiveRecord::Associations,因此它与父级分离。所以要么你直接编辑ActiveRecord::Associations,要么你需要明确地保存孩子。 我明白了。感谢您的帮助!

以上是关于Rails自动保存不保存对关联的更改的主要内容,如果未能解决你的问题,请参考以下文章

有一个带有自动保存功能的 Rails 模型,我应该验证关联吗?

Rails 4 在保存时创建关联对象

rails:关联表(has_and_belongs_to_many)不保存任何记录

Rails 关联不保存

当我在 Chrome 中保存对 html 文件的更改时自动重新加载浏览器?

提交表单时,不会保存对 Rails 输入标记的 javascript 更改