2012-04-13 129 views
1

我需要一個模型,其行爲類似嵌入式和非嵌入式。同時嵌入和不嵌入文檔

例如,如果我要保存這個模型嵌入:

class MenuPosition 
    include Mongoid::Document 
    field :name, type: String 
    field :category, type: String 

我需要

embedded_in :menu 

添加到它。

在另一邊,如果我在模型中添加此行中我不能存儲這個模型沒有嵌入:

position = { 
      "name" => "pork", 
      "category" => "meal", 
      "portion" => 100 
     } 
MenuPosition.create(position) 

錯誤消息:

NoMethodError: 
     undefined method `new?' for nil:NilClass 

我可以使用一個模型嵌入式和非嵌入式文檔?

+0

你能否給出一些解釋,說明你爲什麼要嵌入和不嵌入?可能有不同的方式來實現你想要的,因爲我認爲這種方式不是可能的或可取的。 – Russell 2012-04-13 12:46:43

+0

我想要有產品表,其中會有產品的詳細信息(重量,尺寸,結構等)。用戶創建產品記錄一次,然後在創建產品訂單時使用此信息。不同的產品訂單可以有一個產品,用戶不希望將所有信息放在兩次。 – demas 2012-04-13 13:47:53

+1

好吧,在這種情況下,你可以只使用'has_many'而不是'embeds_many'(在你的例子中),'Menu'會*引用*許多'MenuPositions'而不是*包含*它們? – Russell 2012-04-13 14:07:42

回答

0

在我們的項目中,我們有類似的事情。我們所做的是將這些字段定義爲一個模塊。有點像這樣:

module SpecialFields 
    extend ActiveSupport::Concern 

    included do 
    field :my_field, type: String 
    field :my_other_field, type: String 
    end 
end 

然後在你的類要嵌入,只是做:

include SpecialFields 

在你的類,你想作爲一個非嵌入式文件分開存放,做到這一點:

class NotEmbeddedDoc 
    include Mongoid::Document 

    include SpecialFields 
end 

這個工作很好在我們項目的幾件事情。但是,由於您想嵌入很多內容,因此可能不適合您的情況。這隻適用於嵌入我認爲的一種情況。爲了幫助人們,我已在此發佈它。