Question

I have a Mongoid document called Equipment which can embed multiple Question documents. Here are the document schemas:

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

My issue is that I can retrieve a Question document based on the Question Id. However, my current query returns the parent Equipment document. I would have expected the query to return the embedded Question document. I can eventually get the embedded Question document but I have to loop through all the Question documents of the parent Equipment document.

Here is my current query:

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

Is there a way to directly obtain the embedded Question document?

Was it helpful?

Solution

Because you are using embedded documents, grabbing a single question may not make sense. It does, however, make sense in the context of the parent document. If you really just want a specific question, you can just use normal ARish syntax:

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

I would strongly suggest you make sure you have an index on the question._id field. This will help ensure this query is a fast read operation. Otherwise, Mongo will need to run through all of the Equipment documents and check each of the embedded Question objects.

If the above doesn't work, you can try a nested relation:

Equipment.find(params[:equipment_id]).questions.find(params[:id])

OTHER TIPS

With rails (3.2.15) and mongoid (3.1.5) I can only do it in this way:

@equipment = Equipment.where('questions._id' => Moped::BSON::ObjectId(params[:id])).first
@question = @equipment.questions.find(params[:id])
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top