gpt4 book ai didi

ruby-on-rails - 调用 ActiveRecord 的#relationship_ids = [1,2,3] 立即保存。有什么解决方法吗?

转载 作者:行者123 更新时间:2023-12-04 05:45:05 25 4
gpt4 key购买 nike

我在 ActiveRecord 的 #relationship_ids 方法中遇到了一个奇怪的问题(当你声明“has_many”时会自动添加),它会立即保存现有记录,这给我带来了一些问题,我想知道是否有人有任何有用的建议.

我正在运行 Rails 2.3.5。

考虑这个简单的场景,其中一篇文章有​​_many 个标签,比如说:

a = Article.first
a.name = "New Name" # No save yet
a.author_id = 1 # No save yet
a.tag_ids = [1,2,3] # These changes are saved to the database
# immediately, even if I don't subsequently
# call 'a.save'

这让我感到惊讶。它在尝试构建预览工具时特别会引起问题 - 我想更新一堆属性,然后在不保存的情况下预览文章 - 但在这种情况下,即使其他字段没有保存,标签更改也会被保存。

(可能相关的是,如果 'a' 是一篇新文章,而不是现有文章,那么事情会按照我的预期进行 - 在我调用 'a.save' 之前什么都不会保存)

我有一个相当糟糕的解决方法 - 我可以覆盖模型中的 tag_ids= 方法来填充实例变量,并实际将相关模型保存在 before_save 回调中。

但我很想知道一种比我必须为每个具有 has_many 关系的模型执行此操作更简单的方法,我想为其创建一个预览工具。

有人有任何修复/解决方法/一般建议吗?谢谢!

最佳答案

事情变成这样是有原因的。它被称为外键。在多关系中,链接到多模型的信息作为外键存储在该模型之外。

在文章中,有很多标签。将标签链接到文章的信息存储在标签表或连接表中。当您对文章调用保存时,您只是在保存文章。

事件记录会立即修改那些其他记录。除非您正在处理尚未保存的新文章。如果 Rails 不知道在外键中放置哪个 id,它会延迟创建/更新相关记录。

但是,如果您要修改现有记录,那么您所决定的解决方案就是您所能做的一切。使用 accepts_nested_attributes_for 有一个更丑陋的 hack,但这真的不值得付出努力。

如果您希望将此行为添加到许多模型而不是所有模型,您可能需要考虑编写一个简单的插件来重新定义您需要的方法的分配,并在单个类方法调用中添加回调。查看 acts_as_audited 之类的源代码,了解它是如何完成的。

如果您希望将此行为添加到所有模型,您可以为 has_many 编写一个包装器来实现。

关于ruby-on-rails - 调用 ActiveRecord 的#relationship_ids = [1,2,3] 立即保存。有什么解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2252743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com