gpt4 book ai didi

ruby-on-rails - Rails ActiveRecord 对象的序列化,包括关联

转载 作者:太空宇宙 更新时间:2023-11-03 16:08:55 25 4
gpt4 key购买 nike

我要为包含许多关联的复杂模型提交表单。我需要保存该对象的 2 个副本。一个不会被触及,仅用作最初提交内容的引用,另一个将由我的用户编辑。

我最初对对象和所有关联进行了深度克隆,然后将两者都保存到数据库中,标记了一个字段,这是原始的,可以编辑的。然而,这变得太复杂了,我想要一个更简单的解决方案

我认为我最好的选择是序列化整个对象并将其存储在可编辑对象的单个字段中。所以我的问题是:是否可以序列化一个对象(包括关联)并将其存储在单个字段中?

我应该在模型级别执行此操作吗?还是我应该将表单返回的内容保存在一个字段中? (即 application.original_form = params[:application])。

感谢您的帮助!瑞安

编辑---

我正在尝试这种方法:

https://gist.github.com/1298567

我将返回的参数保存在序列化字段中。

有没有人看到这有任何垮台?这似乎是最简单的方法。

再次感谢!

瑞安

最佳答案

我以前做过类似的事情,但只有一级深度关联。例如。具有一个或多个地址、联系人等的帐户。

您应该确保您与其他相关模型的关联相当简单,因此没有循环或反向指针

最好以一种便于以后与模型的当前版本进行比较的方式保存它。您需要从比较中排除“原始”字段;-)

在第一次保存模型时,我会对模型及其关联进行深度克隆,并将其保存到主模型中的序列化字段“原始”。

我想我会使用 ActiveRecord 的 serialize 功能,例如:

Class YourMainModel
...
serialize :original # will serialize this ; make this TEXT field in DB
...
end

你要确保数据库中字段的数据类型是文本或字符串,而不是二进制字段!(以后会导致错误!)

然后在模型的 after_save 期间,我会添加一些代码来执行如下操作:

# do this in the after_save - so the validations have run:
main_model_object.original ||= main_model_object.deep_clone # ||= to do this only once
main_model_object.save(:validate => false) if main_model_object.original_changed? # save if we added the "copy"

可能还有其他方法可以将其 Hook ,但 after_save 具有运行验证的优势。

您需要确保在第一次保存时创建所有相关记录,您可能想使用 nested_forms Gem 做一个“怪物表格”。

参见:

https://github.com/moiristo/deep_cloneable (Rails 3 的分支)

https://github.com/openminds/deep_cloning (原始项目)

查看其他 Ryan 的 RailsCasts:

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

希望对你有帮助


编辑:

再三考虑,要限制数据库/数据库转储的大小、简化架构并妥善保管原件,您可能希望将原件存储在单独的文档存储中,例如您可以为此使用 MongoDB。

如果您不需要经常访问原件,那么将其作为结构化文档存储在 MongoDB 中可能非常有益,并且它可以让您的主应用程序不那么复杂。

当你比较记录时,你会像第一次一样深度克隆修改后的模型,然后通过原始记录的“id”字段查找 MongoDB 记录,然后比较两者(都是深度克隆).

此解决方案的额外好处:它不会直接附加到 SQL 数据库记录,因此更难意外修改原始文件。例如你不能不小心做 object.original = something

关于ruby-on-rails - Rails ActiveRecord 对象的序列化,包括关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822805/

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