Как обновить update_all (с предложением where) для многих встроенных документов с Mongoid? - PullRequest
1 голос
/ 09 февраля 2012

У меня есть класс Item и класс Comment.Элементы имеют много встроенных комментариев.

Комментарии также хранят имя пользователя, поэтому, если пользователь меняет свое имя пользователя, я хочу обновить все его комментарии.

Я хочу сделать что-то подобноеочевидно, это не работает):

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

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

$ позиционный оператор имеет ограничение 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

Приведенный выше код обновляет каждый элемент один раз со всеми измененными именами пользователей комментариев. Я не проверял код.

0 голосов
/ 09 февраля 2012

Поскольку имя пользователя на самом деле является частью документа встроенного массива, вы должны использовать позиционный оператор , например:

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

...