2012-02-08 13 views
1

私はItemクラスとCommentクラスを持っています。項目には埋め込まれたコメントが多数あります。Mongoidを持つ多くの埋め込みドキュメントのupdate_all(where句を使用)

コメントにはユーザーのユーザー名も格納されるため、ユーザーがユーザー名を変更した場合、そのコメントをすべて更新したいと考えています。

は、私は(明らかにそれが動作しません。)このような何かをしたい:

Item.where('comments.username' => 'elvis33').update_all('comments.username' => 'elvis') 

私はこれをどのように行うのですか?

答えて

2

$ positional operatorには、only applies to the first matched item in the queryという制限があります。

コメントコレクションを取得し、すべてのコメントをループして更新する以外に選択肢が残っていないため、問題についてはJiraに未解決の問題があります。

items = Item.only(:comments).where('comments.username' => 'elvis33') 
items.each do |item| 
    item.comments.select {|com| com.username == 'elvis33'}.each do |comment| 
     comment.username = 'elvis' 
    end 
item.save 
end 

上記のコードは、すべての変更されたコメントユーザー名で各項目を1回更新します。私はコードをテストしていません。

+0

情報とコードRameshVelをありがとう。 '.only(:comments)'句を除いて、あなたのコードで作業しています。コメントは入れ子にされたドキュメントなのかなと思います。とにかく、$ポジション演算子を強化するまで、あなたの答えはそれを行うための最善の方法のようです。 – user657823

0

ユーザ名が実際に埋め込まれた配列の文書の一部であるため、あなたはこのようにpositional operatorを使用する必要があります。

Item.where(「comments.username」=>「elvis33」)update_all( 'コメント。$。username '=>' elvis ')

+0

回答ありがとうございますが、これはうまくいきません。ドキュメントから:現在$演算子は、クエリの最初の**一致した項目にのみ適用されます。 – user657823

関連する問題