gpt4 book ai didi

ruby-on-rails-3 - Mongoid,与带有时间戳和版本控制的嵌入式文档混淆?

转载 作者:可可西里 更新时间:2023-11-01 09:06:54 24 4
gpt4 key购买 nike

现在我已经使用 Mongoid 大约 3 个月了,由于那里有很棒的文档和资源,我已经成功地完成了我需要的几乎所有事情。

但回过头来改进一些我已经做出了一些返回的东西,我在嵌入式文档方面肯定有很多困难。

简而言之,我想做的是维护嵌入式文档的版本控制和时间戳,但我无法做到。

这是我模型的相关部分:

class Content
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paranoia

embeds_many :localized_contents
accepts_nested_attributes_for :localized_contents
end

class LocalizedContent
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paranoia
include Mongoid::Versioning

embedded_in :content, :inverse_of => :localized_contents
end

这里没有什么真正复杂的,关于 Content 模型的行为一切正常,但是 LocalizedContent 模型的行为并不像我期望的那样,所以我的期望要么需要理顺,或者我需要帮助来解决我做错的事情。

要创建一个新的嵌入式文档,我执行以下操作:

my_content = Content.find(params[:id])
my_content.localized_contents.build(params[:localized_content])
if parent.save
#redirect, etc.
end

这在某种意义上是有效的,它成功地在正确的内容中创建了一个新的嵌入文档,但是我留下的时间戳字段为零

现在,如果我尝试更新 localized_content:

my_content = Content.find(params[:content_id])
localized_content = my_content.localized_contents.find(params[:id])

现在,如果我这样做:localized_content.update_attributes(params[:localized_content]) 我会收到以下错误:

=> Mongoid::Errors::InvalidCollection: Access to the collection for LocalizedContent is not allowed since it is an embedded document, please access a collection from the root document.

很公平,然后我自动更新本地化内容上的字段并保存父级:

localized_content.fieldA = "value"
localized_content.fieldB = "value"
localized_content.fieldC = "value"

my_content.save

这可以正确更新本地化内容,但是:- 时间戳(udpated_at 和 created_at)仍然为零- 版本没有收到当前 localized_content 的副本,版本也没有增加!

因此,正如我在该组和网络上的某些论坛中多次阅读的那样,出于性能原因,不会在嵌入式文档上触发回调,因为我在父级上调用保存。再次,足够公平,但正如那些地方所建议的那样,我应该改为在嵌入式文档上调用保存......但是如何!?!?!因为每次我都会害怕:

=> Mongoid::Errors::InvalidCollection: Access to the collection for LocalizedContent is not allowed since it is an embedded document, please access a collection from the root document.

更重要的是,我试图在我的嵌入式上手动回调版本控制:localized_content.revise,同样的错误:

=> Mongoid::Errors::InvalidCollection: Access to the collection for LocalizedContent is not allowed since it is an embedded document, please access a collection from the root document.

我要疯了!请帮忙。我做错了什么?应该如何创建和更新嵌入式文档,以便我可以调用(即使我不在乎手动调用)适当的回调来更新时间戳和版本控制?

谢谢,

亚历克斯

ps: 我使用的是 rails 3.0.3 和 mongoid 2.0.1

最佳答案

为了以防万一这个答案对任何人仍然有用,Mongoid 添加了一个标签,当父对象被保存时,回调在嵌入的子对象上运行。

您的父对象现在应该如下所示:

class Content
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paranoia

embeds_many :localized_contents, cascade_callbacks: true
accepts_nested_attributes_for :localized_contents
end

就是这样!现在,保存父对象将在子对象上运行回调(Mongoid::Timestamps 足够聪明,只在实际更改的对象上运行)。此信息位于嵌入文档页面最底部的 mongoid 文档中。

关于ruby-on-rails-3 - Mongoid,与带有时间戳和版本控制的嵌入式文档混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616779/

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