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
@sandstrom
Copy link

Just noticed the code I posted above don't work that well, it will result in three inserts in some cases. Haven't tracked down the exact cause, don't know enough about how callbacks work yet. Manually doing:

before_save lambda { |r| 
    r.embedded_model.trigger_callback_manually #works for now
}

@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