Mongoid: изменение порядка документов в отношении embeds_many - PullRequest
1 голос
/ 02 мая 2011

У меня есть документ mongoid, в который встраиваются другие документы с таким отношением:

embeds_many: blocks

Создание новых блоков работает нормально, но мне не удается изменить порядок существующих встроенныхдокументы.Например, у меня есть три встроенных блока, и я хочу переместить последний в первую позицию. Какой правильный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Мне приходилось иметь дело с этим с помощью функции muroid 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

Это не очень хороший код выше, но он дает вам представление о том, как делать то, что вы хотите сделать. Я не в восторге от необходимости проходить через это просто, чтобы переупорядочить вещи в массиве, но это так.

1 голос
/ 02 мая 2011

Я думаю, что действительно правильный путь - это сделать во встроенном поле документа "вес" и запросить их с помощью asc (: вес) или desc (: вес). Вы не полагаетесь на порядок сохраняемых не встроенных документов, поэтому не следует использовать встроенные.

Но если вам срочно нужно сделать это, ваши встроенные документы в mongoid - это просто массив, так что вы можете сделать это так:

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