2010-01-21 4 views
1

매우 간단한 설정입니다. 여기를 요약하려면 내가 뭘 내용은 다음과 같습니다: MongoDB를 사용할 때 has_one 관계 문제가 발생했습니다.

class Movie 
    include MongoMapper::Document 
    has_one :setting 
end 

class Setting 
    include MongoMapper::EmbeddedDocument 
    belongs_to :movie 
end 

는 내가하고 싶은 것은 영화 다른 정보와 같은 형태로 영화의 설정을 업데이트하는 것입니다. 나는이 오류로

- form_for ['movies', @movie] do |f| 
    # ... 
    -f.fields_for @movie.setting do |ms| 
    # ... 

이 작동하지 않습니다 : 그 때문에 나는 그렇게

stack level too deep 

[텍스트 울부 짖는 소리가 백 시간을 반복 정도됩니다]

/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations/one_proxy.rb:46:in `find_target' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations/proxy.rb:98:in `load_target' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations/proxy.rb:88:in `method_missing' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations/one_proxy.rb:56:in `target_class' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations/one_proxy.rb:46:in `find_target' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations/proxy.rb:98:in `load_target' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations/one_proxy.rb:17:in `replace' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/associations.rb:39:in `setting=' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/embedded_document.rb:185:in `send' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/embedded_document.rb:185:in `initialize' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/embedded_document.rb:177:in `each' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/embedded_document.rb:177:in `initialize' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/dirty.rb:42:in `initialize' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/embedded_document.rb:91:in `new' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/embedded_document.rb:91:in `initialize_doc' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/document.rb:316:in `find_one' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/document.rb:321:in `find_one!' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/document.rb:88:in `find!' 
/Users/marc/.gem/ruby/1.8/gems/mongo_mapper-0.6.10/lib/mongo_mapper/document.rb:96:in `find' 
/Users/marc/Code/mycompany/dontreadthat/sources/app/controllers/application_controller.rb:53:in `set_page_title' 

여기 잡기가 있습니다 : 영화 모델에서 has_one 관계를 키로 대체하면 :

key :setting, Setting 

... 정상적으로 작동합니다. 스택 오류가 없습니다.

난 그냥 관계를 삭제하고 핵심 만에 갈 수있다 : 나는 다른 모든 속성을 삭제 .update_attributes를 사용 movie.setting 업데이트하려고하면 그것은

  • 꽤 아니다

    • . 이 전 movie.setting.key1를 업데이트한다고 가정 해 봅시다,이 재설정됩니다 movie.setting.key2 ... 정상

    내가 지금 어떤 도움이나 포인터는 크게 감상 할 수있다, 거기에 도움이 아무것도 찾을 수 없습니다

    .

  • 답변

    0

    은 내가 = 방법의 핵심으로 설정을 설정하고 과부하 결국 :

    영화

    def setting=(new_setting) 
        super ((self.setting.nil?)? new_setting : (self.setting.keys.merge new_setting)) 
        end 
    

    에서

    과에서가

    def keys 
        keys_hash = {} 
        self.attributes.each do |attribute| 
         keys_hash.merge!({attribute[0].to_s => attribute[1].to_s}) unless attribute[0].to_s == "_id" 
        end 
        return keys_hash 
        end 
    

    그것은의 최적이 아닌 설정을하지만거야 has_one 관계를 수행하는 더 좋은 방법이있을 때까지 잘 작동합니다. 답에 대한

    3

    나는 has_one 관계가 포함 된 문서로 지원되지 않습니다 확신 해요. 따라서, 예를 들어,이 는 않습니다 일 :

    class Setting 
        include MongoMapper::Document 
        key :movie_id, ObjectId 
        belongs_to :movie 
    end 
    
    class Movie 
        include MongoMapper::Document 
        one :setting, :class => Setting 
    end 
    

    당신은 일류 설정 문서, 당신은 아마 필요로하지 않는, 당신은 유형의 키를 사용하여 이러한 설정을 저장하는 것이 좋습니다을하지 않으려면 해시 또는 Mongo에 대해 정의한 사용자 정의 유형의 다른 키. 예제는 MongoMapper 테스트 스위트의 WindowSize 클래스를 참조하십시오.

    +0

    감사합니다. 난 아직도 내 문제가 : 만약 내가 그렇게 할 경우, @ movie.setting에 액세스하려고 할 때마다 나는 "설정 : 클래스"오류에 대해 "정의되지 않은 메소드를 먼저"얻는다. – marcgg

    관련 문제