【发布时间】:2011-08-16 18:21:20
【问题描述】:
我有一个 mongoid 文档,它嵌入了其他具有类似关系的文档 这个:
embeds_many :blocks
创建新块工作正常,但我无法设法更改 现有嵌入文档的顺序。例如我有三个 嵌入块,我想将最后一个移到第一个 位置。这样做的正确方法是什么?
【问题讨论】:
我有一个 mongoid 文档,它嵌入了其他具有类似关系的文档 这个:
embeds_many :blocks
创建新块工作正常,但我无法设法更改 现有嵌入文档的顺序。例如我有三个 嵌入块,我想将最后一个移到第一个 位置。这样做的正确方法是什么?
【问题讨论】:
我不得不使用 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
上面的代码不是很好,但它让你知道如何做你想做的事。我对仅仅为了重新排列数组中的东西而不得不经历这些并不感到兴奋,但它就是这样。
【讨论】:
new_block = blocks.build(b.attributes)new_block._id = b._idnew_block.save
我认为,真正正确的方法是在您的嵌入式文档字段“权重”中创建并使用 asc(:weight) 或 desc(:weight) 查询它们。您不依赖于持久的非嵌入文档的顺序,因此您不应该嵌入。
但如果你迫切需要这样做,你在 mongoid 中嵌入的文档只是数组,所以你可以这样做:
doc.embedded_docs = [doc.embedded_docs.last] + doc.embedded_docs[0..-2]
【讨论】: