Created
January 22, 2011 02:09
-
-
Save javmorin/790783 to your computer and use it in GitHub Desktop.
sample code which causes strange model interaction with multiple inheritance
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Example | |
include Mongoid::Document | |
field :example_val | |
class Holder < HolderBase | |
embeds_one :item, :class_name => "Example" | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ExampleHolder < HolderBase | |
embeds_one :example | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class HolderBase | |
include Mongoid::Document | |
field :holder_val | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
e = Example.new(:example_val => "Example String") | |
=> #<Example _id: 4d3a398da435fd762a000002, example_val: "Example String"> | |
e.save | |
=> true | |
e_h = Example::Holder.new(:item => e.clone) | |
=> #<Example::Holder _id: 4d3a39a5a435fd762a000004, holder_val: nil> | |
e_h.save | |
e_h.relations | |
=> {"example"=>#<Mongoid::Relations::Metadata | |
class_name: Example, | |
cyclic: No, | |
dependent: None, | |
inverse_of: N/A, | |
inverse_setter: =, | |
inverse_type: N/A, | |
inverse_type_setter: N/A, | |
key: example, | |
macro: embeds_one, | |
name: example, | |
polymorphic: No, | |
relation: Mongoid::Relations::Embedded::One, | |
setter: example=> | |
, "item"=>#<Mongoid::Relations::Metadata | |
class_name: Example, | |
cyclic: No, | |
dependent: None, | |
inverse_of: N/A, | |
inverse_setter: =, | |
inverse_type: N/A, | |
inverse_type_setter: N/A, | |
key: item, | |
macro: embeds_one, | |
name: item, | |
polymorphic: No, | |
relation: Mongoid::Relations::Embedded::One, | |
setter: item=> | |
} | |
e_h.save | |
NoMethodError: undefined method `example' for #<Example::Holder _id: 4d3a39a5a435fd762a000004, holder_val: nil> | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/attributes.rb:75:in `method_missing' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/document.rb:199:in `send' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/document.rb:199:in `to_hash' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/document.rb:198:in `each' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/document.rb:198:in `to_hash' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/document.rb:197:in `tap' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/document.rb:197:in `to_hash' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/persistence/insert.rb:48:in `insert' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/persistence/insert.rb:30:in `persist' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:413:in `_run_save_callbacks' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:93:in `send' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:93:in `run_callbacks' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/persistence/insert.rb:29:in `persist' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:413:in `_run_create_callbacks' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:93:in `send' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:93:in `run_callbacks' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/persistence/insert.rb:28:in `persist' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/persistence.rb:45:in `insert' | |
from /home/mikej/.rvm/gems/ruby-1.8.7-p302@global/gems/mongoid-2.0.0.rc.6/lib/mongoid/persistence.rb:145:in `save' | |
from (irb):13 |
Thanks for the gist... This is an odd way of modeling things to me, but the first thing I can see is Example needs an embedded_in defined... But I'll need to mess around with this a bit to see what exactly needs to be done.
And yeah this is also another class_attribute issue I believe.
agreed, this is an odd setup, and it didn't stay that way, it was the result of artifacts to a refactoring process.
Another thing to check would be if it generates the same behavior if there is two (or more) classes which inherit from HolderBase of either a nested or non-nested type. It's possible the naming doesn't matter, but the number of things that inherit from a common base class. I don't have the time to test this today though.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
One further note.. if the inheritance on HolderBase is removed, things work just fine as well. My first attempt to reproduce the issue didn't reproduce the bug for that very reason. So it's the creative inheritance involved which trips things up.