Mongoid - два модификатора обновления в одном вызове для обновления документа в mongodb

Я пытаюсь экспериментировать с mongodb, mongoid и rails. У меня есть простая модель задач и комментариев в Rails, где комментарии встроены в задачи. Теперь у Task есть атрибут comment_count. Есть ли способ увеличить счетчик, а также добавить новый комментарий за один вызов.

Модель задачи:

class Task
  include Mongoid::Document
  field :name
  field :desc
  field :comment_count, type: Integer, default: 0
  embeds_many :comments
end

Модель комментария:

class Comment
  include Mongoid::Document
  field :entry
  embedded_in :task
end

Ниже приведена операция, которую я хочу выполнить за один вызов.

1.9.3p194 :025 > task.comments.push(Comment.new(entry: "This is a comment"))
 => [#<Comment _id: 509e1708a490b3deed000003, _type: nil, entry: "First comment">, #<Comment _id: 509e1716a490b3deed000004, _type: nil, entry: "Second comment">, #<Comment _id: 509e1aa3a490b3deed000005, _type: nil, entry: "This is a comment">] 
1.9.3p194 :026 > task.inc(:comment_count, 1)
 => 3 

На самом деле я намереваюсь использовать несколько модификаторов обновления, таких как $inc, $push, $pop и т. д., в одном вызове обновления. Подобно тому, что мы можем сделать непосредственно в оболочке mongo.

Пожалуйста помоги. Спасибо


person Dipayan    schedule 10.11.2012    source источник


Ответы (1)


К сожалению, Mongoid, похоже, не поддерживает counter_cache, как это делает ActiveRecord.

Вы можете использовать обратный вызов after_save и after_destroy в своей модели Comment, чтобы реализовать это, соответственно увеличивая/уменьшая значение счетчика родителя.

person m_x    schedule 10.11.2012
comment
Спасибо за ответ. На самом деле, текущее упражнение выглядит как реализация counter_cache, но на самом деле я намеревался получить способ использования нескольких модификаторов обновления, таких как $inc, $push, $pop и т. д. в одном вызове обновления. Подобно тому, что мы можем сделать непосредственно в оболочке mongo. Я обновлю свой вопрос с этим. - person Dipayan; 10.11.2012
comment
я плохо знаю монгоид, но разве это не цель find_and_modify< /а> ? - person m_x; 10.11.2012