0

私は3つの書類を持っています。

User
List
Food

リストには多くの食品を含めることができ、ユーザー ドキュメント内に埋め込まれます。ユーザーが食品を使い終わったときに、ユーザーのリストをループし、リストとユーザーが完了した特定の食品との間の関連付けを削除するアクションがコントローラーにあります。

@user.lists.to_a.each do |list|

  list.food_ids.to_a.map do |food_id|
    if food_id.eql? params[:food_id]

      food = Food.find(params[:food_id])

      # Pull food from list
      list.pull(:foods, food)

    end
  end
end

@user.save

私のモデル

ユーザー

class User

  # INCLUDES
  # ========
  include Mongoid::Document

  include Mongoid::Paperclip

  include Mongoid::MultiParameterAttributes

  include Mongoid::Spacial::Document

  # EMBEDDING
  # =========
  embeds_many :lists

  # NESTED ATTRIBUTES
  # =================
  accepts_nested_attributes_for :lists
end

リスト

class List
  include Mongoid::Document

  has_and_belongs_to_many :foods

  embedded_in :user

  belongs_to: popular_list  
end

食べ物

class Food

  # INCLUDES
  # ========
  include Mongoid::Document

  include Mongoid::Timestamps

  include Mongoid::Paperclip

  include Mongoid::Spacial::Document

  # ASSOCIATIONS
  # ============
  belongs_to :user

  has_and_belongs_to_many :popular_lists

end

問題は、私のコードがリストから食品を削除しないことです。私の質問は、どのように配列をループし、その配列からアイテムを取得し、新しい配列が保存されることを期待できるでしょうか?

4

1 に答える 1

1

2 つの問題が原因で機能していません。まず、 を埋め込むことができませんList。通常の で独自のコレクションにしますbelongs_to :user

反対側はIDのみを保存するため、埋め込みモデルとの関係を持つことはできません。そのリレーションを使用すると、Mongoid はMyEmbeddedModel.find(related_id)埋め込みモデルを見つけることができない呼び出しを行います。これは、それが別のドキュメント内にあり、独自のコレクションではないためです。

2 つ目は、コードに対応するbelongs_to :userとがありませんhas_and_belongs_to_many :foodsドキュメントには次のように記載されています:Definitions are required on both sides to the relation in order for it to work properly. これらを追加すると (私の要点を参照)、Mongoid はエラーを発生させ、埋め込まないことを提案しますList:

(モンゴイド::エラー::MixedRelations)

問題: List が埋め込まれているため、リレーショナル アソシエーションを介して Food ドキュメントから a(n) List ドキュメントを参照することはできません。

概要: Food から a(n) List に適切にアクセスするには、参照は List のルート ドキュメントを通過する必要があります。単純なケースでは、Mongoid がルートの追加の外部キーを格納する必要があります。List が複数のレベルの深さであるより複雑なケースでは、階層の各親に対してキーを格納する必要があります。解決策: List を埋め込まないことを検討するか、アプリケーション コードで独自の方法でキー ストレージとアクセスを実行します。

于 2013-03-30T00:03:54.590 に答える