2

두 모델 사용자상태입니다. 나는 사용자의 내부 상태의 문서를 만들려고 해요 이제몽고 이드 내부에 포함 된 문서 작성

User.rb

class User 

    include Mongoid::Document 
    include Mongoid::Timestamps 

    embeds_one :status, as: :statusable 

Status.rb

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 

왜 이런 일이 발생하는지 알고 싶습니다. 문서에서

답변

2

:이 단어의 복수로 형태 으로 간주되기 때문에

모델 클래스의 이름은, "S"로 끝날 수 없습니다. 예를 들어 Status는 이 Statu의 복수형으로 간주되어 약간의 알려진 문제를 일으킬 수 있습니다.

class_name 메타 데이터로 관계를 정의하여 mongoid가 해당 클래스를 사용하도록하십시오.

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

흥미 롭습니다! mongomapper에서 나는'Status' 모델에 그런 문제가 없다! – user2503775

2

여기에는 몇 가지 문제점이 있습니다. marquez가 대답 한대로 "s"로 끝나는 모델 클래스 이름은 문제가되지만 class_name 지정자를 통해 주소 지정이 가능합니다. 다형성이 필요 없다면 User # status와 User # status =에 대해 자동 생성 된 메소드를 사용하면됩니다. 그러나 다형성과 class_name 대체를 사용하면 "as :"지정자가 나를 대신 사용할 수 없지만 다음은 수행했습니다. 앞으로 나아갈 수 있기를 바랍니다.

응용 프로그램/모델/user.rb

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embeds_one :statusable, class_name: "Status" 
end 

응용 프로그램/모델/status.rb

class Status 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embedded_in :statusable, polymorphic: true 
end 

테스트/단위/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 

$ 레이크 시험

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 
+0

"as :"지정자가 다형성 및 class_name 대체와 함께 나를 위해 작동합니다. 사용자 레코드에서 status obj가 아니라 statusable obj이어야합니다. 호출 :'s = user.status' 그리고 나서's.statusable'는 사용자에게 – user2503775