срабатывание after_save для встроенного элемента при назначении его через «<<» в mongoid? - PullRequest
2 голосов
/ 17 августа 2010

Мне было интересно, есть ли способ вызвать обратный вызов after_save для объекта внедренного в Mongoid mapper.

Пример:

i = Image.new(:file => file)
user.images << i
# => i.after_save should be triggered here

Я знаю, что если я вызову i.save после слов, он будет запускаться, однако действительно трудно запомнить это во всем моем коде.

Кроме того, вызов user.images.create(:file => file) не вариант, потому что я проверяю, чтобы убедиться, что тот же файл незагружено дважды.

Ответы [ 2 ]

3 голосов
/ 16 марта 2013

Хорошо, это старый вопрос, но с последним Mongoid вы можете использовать:

http://mongoid.org/en/mongoid/docs/relations.html

Каскадные обратные вызовы

Если вы хотите встроенные обратные вызовы документачтобы сработать при вызове персистентной операции для его родителя, вам нужно будет предоставить опцию каскадных обратных вызовов для отношения.

Каскадные обратные вызовы доступны только для отношений embeds_one и embeds_many.*

band.save # Запускает все сохраненные обратные вызовы для группы, альбомов и лейбла.

2 голосов
/ 22 ноября 2010

Единственным реальным решением является вызов save во встроенном документе.Вот способ сделать это автоматически:

class User
  references_many :images do
    def <<(new_elm)
      returner = super
      new_elm.save
      returner
    end
  end
end

Подробнее здесь:

https://github.com/mongoid/mongoid/issues/173

...