Skip to content

Instantly share code, notes, and snippets.

@ches
Forked from zerobearing2/embedded_callbacks.rb
Created December 30, 2010 13:22
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ches/759788 to your computer and use it in GitHub Desktop.
Save ches/759788 to your computer and use it in GitHub Desktop.
bubble down callbacks to embedded associations with mongoid
# encoding: utf-8
module Mongoid #:nodoc:
module Associations #:nodoc:
module EmbeddedCallbacks
# bubble callbacks to embedded associations
def run_callbacks(kind, *args, &block)
# now bubble callbacks down
self.associations.each_pair do |name, meta|
if meta.association == Mongoid::Associations::EmbedsMany
self.send(name).each { |doc| doc.send(:run_callbacks, kind, *args, &block) }
elsif meta.association == Mongoid::Associations::EmbedsOne
self.send(name).send(:run_callbacks, kind, *args, &block)
end
end
super(kind, *args, &block) # defer to parent
end
end
end
end
class Photo
include Mongoid::Document
include Mongoid::Timestamps
mount_uploader :image, ImageFileUploader
embedded_in :some_model, :inverse_of => :photos
validates_presence_of :image
end
class SomeModel
include Mongoid::Document
include Mongoid::Associations::EmbeddedCallbacks
include Mongoid::Timestamps
embeds_many :photos
end
@tessro
Copy link

tessro commented Apr 15, 2011

You're getting multiple inserts on a sporadic basis because each run_callbacks call will trigger the block, which contains a persistence operation. (If you call it in a loop, watch out!) I ran into the same issue.

I submitted a pull request that resolves this problem. If it is still a blocker for you, please try out my patch and provide feedback!

https://github.com/mongoid/mongoid/pull/845

@ches
Copy link
Author

ches commented Jun 27, 2011

For the record I'm now using @paulrosania's patch with success, thanks Paul! Here's hoping it's merged soon.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment