diff --git a/lib/mongoid/fields.rb b/lib/mongoid/fields.rb index 69b0a5cb86..37d91d6bef 100644 --- a/lib/mongoid/fields.rb +++ b/lib/mongoid/fields.rb @@ -21,7 +21,6 @@ module Fields self.pre_processed_defaults = [] self.post_processed_defaults = [] - field(:_type, default: ->{ self.class.name if hereditary? }, type: String) field( :_id, default: ->{ Moped::BSON::ObjectId.new }, diff --git a/lib/mongoid/hierarchy.rb b/lib/mongoid/hierarchy.rb index 8d80d52157..1c8315b2e6 100644 --- a/lib/mongoid/hierarchy.rb +++ b/lib/mongoid/hierarchy.rb @@ -145,6 +145,13 @@ def inherited(subclass) subclass.pre_processed_defaults = pre_processed_defaults.dup subclass.post_processed_defaults = post_processed_defaults.dup subclass.scopes = scopes.dup + + # We only need the _type field if inheritance is in play, but need to + # add to the root class as well for backwards compatibility. + unless fields.has_key?("_type") + field(:_type, default: self.name, type: String) + end + subclass.field(:_type, default: subclass.name, type: String) end end end diff --git a/spec/mongoid/fields_spec.rb b/spec/mongoid/fields_spec.rb index da4d9039a8..78780cb23a 100644 --- a/spec/mongoid/fields_spec.rb +++ b/spec/mongoid/fields_spec.rb @@ -634,7 +634,7 @@ end it "does not return subclass defaults" do - shape.pre_processed_defaults.should eq([ "_id", "x", "y" ]) + shape.pre_processed_defaults.should eq([ "_id", "x", "y", "_type" ]) end end @@ -645,7 +645,7 @@ end it "has the parent and child defaults" do - circle.pre_processed_defaults.should eq([ "_id", "x", "y", "radius" ]) + circle.pre_processed_defaults.should eq([ "_id", "x", "y", "_type", "radius" ]) end end end