2011-05-02 28 views
1

我有嵌入其他文件与像 这样的关系的mongoid文件:Mongoid:更改文件的顺序在embeds_many关系

embeds_many:块

创建新块工作正常,但我不能设法更改 现有嵌入式文档的顺序。例如,我有三个 嵌入块,我想将最后一个移动到第一个 position.What是正确的方法来做到这一点?

回答

2

我不得不处理这跟mongoid的recursively_embeds_many功能,但它的本质一样。据我所知,从字面上重写文档是没有问题的。写模型方法做这样的事情:

def reverse_blocks 
    reversed_blocks = blocks.to_a.reverse 
    blocks.clear 
    reversed_blocks.each do |b| 
    blocks.create b.attributes 
    end 
    save 
end 

那上面不是很大的代码,但它可以让你怎么做你想做的事的想法。我不必为了重新排列数组中的东西而经历那些事情,但它确实存在。

+0

这似乎不起作用(不再? - 我使用的是mongoid 3.0.9)。没有重复b.attributes我得到一个错误,因为一个冷冻散列。然后我遇到_id/_type不能访问的问题(attr_accessible)。所以我需要禁用质量分配保护(我不想要) – 2012-10-22 06:16:17

+0

你可能是对的。这是在Mongoid 2上明确发现的。你将要把b.attributes设置为仅仅是你想要复制的字段,而忽略_id,_type等等。属性方法必须在3中以不同的方式工作,我可以只承担。 – jeremy6d 2013-01-12 02:42:03

+0

如果你想保留受保护的属性(_id,_type等等),你需要明确地设置它们。 例如: 'new_block = blocks.build(b.attributes)' 'new_block._id = b._id' 'new_block.save' – Matt 2013-10-04 19:44:33

1

我认为,真正正确的方法是在您的嵌入式文档字段中使用“weight”,并使用asc(:weight)或desc(:weight)查询它们。你不依赖于持久化的非嵌入式文档的顺序,所以你不应该嵌入。

不过如果你迫切需要进行此,在mongoid嵌入式文档只是数组,所以你可以做这样的方式:

doc.embedded_docs = [doc.embedded_docs.last] + doc.embedded_docs[0..-2] 
+0

我试过了,但数组之后是空的!?我也看到这种行为,如果我尝试“反向”或类似的东西。使用:重量不是一个选项。我使用MongoDB是因为我不想这样做“SQL方式”。 ;-) – Achim 2011-05-02 17:26:34

+0

我收到了来自mongodb列表的反馈。移动单个数组元素是不可能的。一个人必须重写这个文档,但是对于Mongoid和嵌入式文档来说这似乎是不可能的。因此,使用重量/订购的解决方案似乎是最好的 - 即使我不喜欢它。 : -/ – Achim 2011-05-02 22:40:33

+0

实际上MongoDB不是纯粹的NoSQL解决方案,而是一种关系型和NoSQL方法的混合。所以我认为,这种方法相当有效。 – sandrew 2011-05-03 02:59:47