There were a couple of issues here.
As answered by marquez, the model class name ending in "s" is problematic but addressable via the class_name specifier.
If you didn't need polymorphism, then you would just use auto generated methods for User#status and User#status=.
But with polymorphism and the class_name override, the "as:" specifier didn't work for me, but the following did.
Hope that this helps you move on.
app/models/user.rb
class User
include Mongoid::Document
include Mongoid::Timestamps
embeds_one :statusable, class_name: "Status"
end
app/models/status.rb
class Status
include Mongoid::Document
include Mongoid::Timestamps
embedded_in :statusable, polymorphic: true
end
test/unit/user_test.rb
require 'test_helper'
require 'pp'
class UserTest < ActiveSupport::TestCase
def setup
User.delete_all
end
test "basic embedding" do
User.create!(:name =>'try',:statusable => {:num => '111'})
assert_equal 1, User.count
u = User.create!(:name =>'try')
u.statusable = Status.new(:num => '222')
assert_equal 2, User.count
puts
pp (User.all.to_a.collect{|user| user.serializable_hash})
end
end
$ rake test
Run options:
# Running tests:
[1/1] UserTest#test_basic_embedding
[{"_id"=>"5277f5077f11bac4b4000001",
"created_at"=>Mon, 04 Nov 2013 19:27:03 UTC +00:00,
"name"=>"try",
"statusable"=>
{"_id"=>"5277f5077f11bac4b4000002",
"created_at"=>nil,
"num"=>"111",
"updated_at"=>nil},
"updated_at"=>Mon, 04 Nov 2013 19:27:03 UTC +00:00},
{"_id"=>"5277f5077f11bac4b4000003",
"created_at"=>Mon, 04 Nov 2013 19:27:03 UTC +00:00,
"name"=>"try",
"statusable"=>
{"_id"=>"5277f5077f11bac4b4000004",
"created_at"=>Mon, 04 Nov 2013 19:27:03 UTC +00:00,
"num"=>"222",
"updated_at"=>Mon, 04 Nov 2013 19:27:03 UTC +00:00},
"updated_at"=>Mon, 04 Nov 2013 19:27:03 UTC +00:00}]
Finished tests in 0.044048s, 22.7025 tests/s, 45.4050 assertions/s.
1 tests, 2 assertions, 0 failures, 0 errors, 0 skips