4

複数の Question ドキュメントを埋め込むことができる Equipment という Mongoid ドキュメントがあります。ドキュメント スキーマは次のとおりです。

class Equipment
  include Mongoid::Document
  include Mongoid::Timestamps

  field :description
  field :modelNumber
  field :title
  field :categoryId
  field :subCategoryId
  field :stateId
  field :city
  field :askingPrice

  embeds_many :questions

end

class Question
  include Mongoid::Document
  field :content

  attr_accessible :content

  embedded_in :equipment, :inverse_of => :questions
  embeds_one :answers
end

私の問題は、質問 ID に基づいて質問ドキュメントを取得できることです。ただし、現在のクエリは親の Equipment ドキュメントを返します。クエリが埋め込まれた質問ドキュメントを返すことを期待していました。最終的に、埋め込まれた Question ドキュメントを取得できますが、親の Equipment ドキュメントのすべての Question ドキュメントをループする必要があります。

これが私の現在のクエリです:

@question = Equipment.where('questions._id' => Moped::BSON::ObjectId(params[:id])).first

埋め込まれた質問文書を直接取得する方法はありますか?

4

2 に答える 2

5

埋め込みドキュメントを使用しているため、単一の質問を取得することは意味がない場合があります。ただし、親ドキュメントのコンテキストでは意味があります。本当に特定の質問が必要な場合は、通常の ARish 構文を使用できます。

question = Question.find(params[:id])

フィールドにインデックスがあることを確認することを強くお勧めしますquestion._id。これは、このクエリが高速な読み取り操作であることを確認するのに役立ちます。それ以外の場合、Mongo はすべてのEquipmentドキュメントを実行し、各埋め込みQuestionオブジェクトをチェックする必要があります。

上記が機能しない場合は、ネストされたリレーションを試すことができます。

Equipment.find(params[:equipment_id]).questions.find(params[:id])
于 2013-06-24T15:09:22.200 に答える
3

レール (3.2.15) とモンゴイド (3.1.5) では、次の方法でのみ実行できます。

@equipment = Equipment.where('questions._id' => Moped::BSON::ObjectId(params[:id])).first
@question = @equipment.questions.find(params[:id])
于 2014-03-15T14:02:07.360 に答える