Ruby on rails Mongoid在父级中创建嵌入文档

Ruby on rails Mongoid在父级中创建嵌入文档,ruby-on-rails,mongodb,mongoid,embedding,database-relations,Ruby On Rails,Mongodb,Mongoid,Embedding,Database Relations,我有两种型号用户和状态。 状态嵌入到用户: User.rb class User include Mongoid::Document include Mongoid::Timestamps embeds_one :status, as: :statusable class Status include Mongoid::Document include Mongoid::Timestamps embedded_in :statusable, polymorphi

我有两种型号用户状态。 状态嵌入到用户:

User.rb

class User

  include Mongoid::Document
  include Mongoid::Timestamps

  embeds_one :status, as: :statusable
class Status

  include Mongoid::Document
  include Mongoid::Timestamps

  embedded_in :statusable, polymorphic: true
状态.rb

class User

  include Mongoid::Document
  include Mongoid::Timestamps

  embeds_one :status, as: :statusable
class Status

  include Mongoid::Document
  include Mongoid::Timestamps

  embedded_in :statusable, polymorphic: true
现在,我正在尝试在用户中创建状态文档:

* User.create!(:name =>'try',:status => {:num => '111'})
=> NameError: uninitialized constant Statu
    from /var/lib/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/inflector/methods.rb:230:in 'block in constantize'
    from /var/lib/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/inflector/methods.rb:229:in 'each'
    ....
    ....

* u = User.create!(:name =>'try')
u.status = Status.create!(:num => '222')
=> Mongoid::Errors::NoParent: 
Problem:
  Cannot persist embedded document Status without a parent document.
Summary:
  If the document is embedded, in order to be persisted it must always have a reference to its parent document. This is most likely caused by either calling Status.create or Status.create! without setting the parent document as an attribute.
Resolution:
  Ensure that you have set the parent relation if instantiating the embedded document direcly, or always create new embedded documents via the parent relation.

* u.status = {:num => '222'}
=> NameError: uninitialized constant Statu
知道为什么会发生这种情况吗?

来自文档:

模型类名不能以“s”结尾,因为它将被视为 这个词的复数形式。例如,状态将是 被认为是Statu的复数形式,这将导致一些已知的 问题

因此,请尝试定义您与
class\u name
元数据的关系,强制mongoid使用该类

embeds_one :status, as: :statusable, class_name: "Status"

这里有几个问题。 正如marquez所回答的,以“s”结尾的模型类名有问题,但可以通过类名说明符进行寻址。 如果您不需要多态性,那么您只需要为User#status和User#status=使用自动生成的方法。 但是有了多态性和类名覆盖,“as:”说明符对我不起作用,但下面的说明符对我起作用了。 希望这能帮助你继续前进

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.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

有趣!在mongomapper中,我对
状态
模型没有这样的问题!“as:”说明符确实适用于我,还适用于多态性和类名覆盖。请注意,在用户记录中应该是状态obj,而不是可状态obj。调用:
s=user.status
,然后调用
s.statusable
,为用户提供