2011-05-02 60 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