2010-01-21 38 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' 

這裏有一個問題:當我用Movie模型中的一個鍵替換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 

這不是最佳,但它會工作得很好,直到有更好的方式去做一對一的關係。

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 2010-01-22 08:25:23