Запрос встроенных документов в документе с MongoMapper - PullRequest
6 голосов
/ 25 мая 2011

Что такое хороший шаблон для запроса встроенных документов в документе? Например, мой пользовательский документ имеет встроенный документ Alerts. Если я хочу узнать, есть ли у данного пользователя предупреждение с именем, я могу сделать это двумя способами, насколько я могу судить - в памяти а-ля

alert = current_user.alerts.select{|a| a.name == params[:name]}.first

или через фактический интерфейс документа (обратите внимание, что я не уверен на 100%, что это семантически правильно, но вы понимаете):

User.where('alerts.name' => params[:name], :id => current_user.id).first

Должен быть лучший способ, что-то вроде

current_user.alerts.where(:name => params[:name])

возможно? Или, может быть, я просто не думаю о проблеме, верно?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2012

Я думаю, что Mongoid поддерживает это, см. «Поиск» в руководстве по встроенным документам .

0 голосов
/ 22 января 2015

Вы можете сделать либо:

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).first.alerts.select{|u| u.name == params[:name]}

или

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).alerts.select{|u| u.name == params[:name]}.first
0 голосов
/ 27 мая 2011

Неа.И я думаю, что это мотивация:

В MongoMapper запросы к базе данных всегда возвращают корневой объект.Разрешение запросам возвращать встроенный документ без его родителя было бы разрывом с этим и усложнило бы многие вещи (что, если бы я назвал .parent внутри этого встроенного документа?), Так что MongoMappers ошибается на стороне простоты и не притворяетсячто вещи - это то, чем они не являются.Внедренные документы хранятся в массиве внутри корневого документа в MongoDB, поэтому MongoMapper предоставляет вам массив в Ruby.

Таким образом, вы можете использовать его двумя способами.

Если вам нужен синтаксический suger, его не должно быть слишком сложно.Вы можете расширить Array или написать код плагина для расширения на прокси MongoMapper для встроенных документов .

...