2013-06-24 2 views
3

У меня есть документ Mongoid под названием Оборудование, которое может вставлять несколько документов Вопроса. Вот схемы документов:Извлечение встроенного документа с использованием 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 

Моя проблема заключается в том, что я могу получить документ вопроса на основе идентификатора вопроса. Однако мой текущий запрос возвращает родительский документ Equipment. Я бы ожидал, что запрос вернет встроенный документ Вопроса. В конечном итоге я могу получить встроенный документ Вопроса, но мне нужно пройти все документы Вопроса родительского документа оборудования.

Вот мой текущий запрос:

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

Есть ли способ, чтобы получить непосредственно внедренный Вопрос документ?

ответ

5

Поскольку вы используете встроенные документы, захват одного вопроса может не иметь смысла. Однако это имеет смысл в контексте родительского документа. Если вы действительно хотите просто конкретный вопрос, вы можете просто использовать обычный синтаксис Ариш:

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

Я бы настоятельно рекомендуем вам убедиться, что у вас есть индекс на question._id поле. Это поможет гарантировать, что этот запрос является операцией быстрого чтения. В противном случае Mongo нужно будет пропустить все документы Equipment и проверить каждый из встроенных объектов Question.

Если выше не работает, вы можете попробовать вложенное соотношение:

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

Благодарим за отзыв! Два предложенных вами предложения не помогли мне. :-(Однако это работает для меня: equipment = Equipment.find (params [: id]) question = equipment.questions.find (params [: question_id]). Любые мысли о том, как я могу объединить эти два запроса в один? –

+1

@RichBlumer, это в основном второй запрос, который я написал. У вас просто разные имена для ваших параметров. 'question = Equipment.find (params [: id]). questions.find (params [: question_id])' –

+0

Я согласен Моя проблема заключалась в том, что я не мог сцепить их вместе, как и вы. Всегда возникала ошибка в вопросах, таких методов нет. Я просто попробовал это, как будто у вас есть цепочки, и это работает! Спасибо за вашу помощь! –

2

с рельсами (3.2.15) и Mongoid (3.1.5) Я могу только сделать это таким образом:

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