2013-07-01 2 views
0

Я настоящий новичок с MongoDB и MongoID. я создал два подмостиОтображает только одно поле из встроенного документа с MongoID

class Objet 
    include Mongoid::Document 
    field :nom, type: String 

    embeds_one :coordonnee 
end 

И

class Coordonnee 
    include Mongoid::Document 
    field :adresse1, type: String 
    field :adresse2, type: String 
    field :code_postal, type: String 
    field :ville, type: String 

    embedded_in :objet 
end 

Вот что я получаю при создании нового Objet:

Objet document

Теперь я пытаюсь показать только поле adresse1 для этого документа, но он не работает. Я могу показать только весь внедренный документ, делая это:

Когда я делаю:

<%= @objet.coordonnees.adresse1 %> 

Я получаю эту ошибку:

undefined method `adresse1' for #<Hash:0x2b2b1f0> 

Как я могу это сделать?

EDIT

Делая это, я могу отобразить все элементы "Adresse1, adresse2, Виль, code_postal":

Controller 

def show 
    @objet = Objet.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @objet } 
    end 
    end 

View 

<%= @objet.nom %> 
    <% @objet.coordonnee.each do |t| %> 
    <%= t[1] %> 
    <% end %> 

Но мой вопрос: Как отображать только один из них? Например, ville, или code_postal или adresse1 ...?

ответ

0

Не очень знакомы с MongoID, но при условии, что вы можете звонить напрямую в mongo, есть второй неявный параметр для всех find-подобных операторов, называемых projection, который указывает, что именно вы хотели бы вернуть.

Например, показывая только adresse1 для всех элементов в вашей коллекции:

db.collection.find({},{"coordonnees.adresse1": 1, "_id":0}) 

должен возвращать только параметр adresse1. Я был не в состоянии точно сказать, в каком контексте вы показываете объекты, но независимо от контекста, вызовы api для mongo должны быть достаточно простыми. Дайте мне знать, если я неверно истолковал этот вопрос.

В вашем публикуемую Например, вы должны изменить свою функцию поиска, чтобы что-то вроде следующего:

Objet.find({params[:id]}, {:fields => [coordonnees.adresse1]}) 

Надежда, что помогает.

+0

Благодарим вас за интерес к моему вопросу. Как я могу перевести этот 'db.collection.find ({}, {" adresse1 ": 1})' в show.html.erb? –

+0

@ GrégoireC вы можете разместить свой текущий show.html.erb? –

+0

Я отредактирую свое сообщение :) –

0

Какой у вас код, который работает для полного документа? Он был снят с вашего поста.

В оболочке mongo вы можете сделать это с помощью точечной нотации db.collection.find({},{'coordonnees.adresse1':1,'_id':0}) Вам необходимо указать '_id':0, потому что _id всегда возвращается по умолчанию.

Другой ответ не будет работать, потому что adresse1 является поддокументом. Вы должны указать ссылку на coordonnees.

+0

Спасибо за указание, что я сделал небольшую опечатку, но я бы предпочел ее как комментарий, чем удар в другом ответе ... –

+0

Также вы имеете в виду collection.find, collectionfind doesn ' t существует. Конструктивная критика лет. –

+0

Извините @SlaterTyranus, я бы предпочел прокомментировать ваш ответ, но у меня нет достаточной кармы для этого. Вы отправили свой ответ, пока я печатал мой, - если бы я видел его сначала, я бы полностью избежал вопроса. – SuperAce99

0

Я нашел решение своей проблемы. Чтобы отобразить только один элемент хэша, я могу сделать:

<%= @objet.coordonnees['adresse1'] %> 
0

Я не уверен, что если вы используете embeds_one или embeds_many, как вы используете единственного и множественного числа форм имени отношения взаимозаменяемыми в вашем вопросе.

Если это embeds_one, проблема в том, что вы не должны перебирать @objet.coordonnee, поскольку это один документ. Ваше мнение код должен выглядеть следующим образом:

<%= @objet.nom %> 
<%= @objet.coordonnee.address1 %> 

Если это embeds_many, ваше имя отношение должно быть во множественном числе, то вы должны быть в состоянии использовать t.address1 на ваш взгляд.

# model Objet 
embeds_many :coordonnees 

# view 
<%= @objet.nom %> 
<% @objet.coordonnees.each do |t| %> 
    <%= t.address1 %> 
<% end %> 
Смежные вопросы