2012-04-13 32 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

+0

商品に関する詳細情報(重量、サイズ、構造など)を持つ商品表を持っています。ユーザーは製品レコードを一度作成し、この情報を使用して製品注文を作成します。異なる製品オーダーは1つの製品を有することができ、ユーザーはすべての情報を2回置くことを望まない。 – demas

+1

その場合、 'embeds_many'の代わりに' has_many'を使うことができます(あなたの例では 'Menu'はそれらを含むのではなく' MenuPositions'を多く参照するでしょうか? – Russell

答えて

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 

これは、私たちのプロジェクトではかなりうまくいくものでした。しかし、多くを埋め込みたいので、あなたのケースでは適切ではないかもしれません。これは実際に私が考える1つの場合の埋め込みのためだけに機能します。それが人々を助ける場合に備えてここに掲載しました。

関連する問題