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:关联表(has_and_belongs_to_many)不保存任何记录