2012-06-18 4 views
1

Это, наверное, очень простой вопрос, я прошу прощения - я новичок в рельсах.Использование has_many/принадлежит для доступа к информации в контроллере - Ruby on Rails

У меня есть два контроллера - клиенты и заказы. У меня есть так, что, когда клиент отправляет заказ, их идентификатор передается в скрытом поле, так что поле customer_id в таблице заказов имеет свой идентификатор. Таким образом, все заказы имеют идентификатор клиента, который его разместил. То, что я пытаюсь сделать, - показать шоу, чтобы клиенты отображали все их заказы - так что все заказы с их идентификатором.

У меня есть заказчик has_many заказов и заказов принадлежит клиентам и т. Д. Как мне обратиться к клиентам/заказам, чтобы извлечь нужную информацию? И мне нужно добавить дополнительную информацию в действие шоу на контроллере? Я пробовал все, что мог придумать! До сих пор я мог получить хэш всей информации, которая будет отображаться в представлении show, но я не могу получить отдельные биты информации - например. стоимость заказа.

Я в основном хочу таблицу деталей заказа в представлении показать клиентов - цена заказа, дата и т. Д. Любая помощь будет очень признательна, спасибо!

Редактировать: У меня теперь есть это - но не получается получить бит line_items. Эти отношения работают следующим образом: клиент имеет много заказов, заказы имеют много позиций, позиции относятся к продуктам. Я подозреваю причину, по которой он не работает, из-за принадлежности.

<% @customer.orders.each do |order| %> 
    <% order.line_items.each do |line_item| %> 
     <tr> 
      <td><%= line_item.created_at %></td> 
       <% line_item.products.each do |product| %> 
        <td> <%= product.name %></td> 
       <% end %> 
      <td><%= order.email %></td> 
     </tr> 
    <% end %> 
<% end %> 

ответ

0

Не нужно ничего добавлять к контроллеру show.

У вашего клиента show Вы, возможно, имеете доступ к объекту @customer. Из-за вашего has_many, у этого будет коллекция @customer.orders. Так, по мнению, вы можете сделать что-то вроде

<table> 
<thead> 
    <td>Item</td> 
    <td>Quantity</td> 
    <td>Price</td> 
    <td>Date Placed<td> 
</thead> 

<% @customer.orders.each do |order| %> 
<tr> 
    <td><%= order.item.name %></td> 
    <td><%= order.quantity %></td> 
    <td><%= order.price %></td></tr> 
    <td><%= order.date_placed %></td> 
</tr> 
<% end %> 

</table> 

Очевидно, что я готовлю на возможные order поля вы хотите отобразить, но это должно дать вам идею.

+0

Спасибо! Это оно! Кроме того, если бы я хотел отображать отдельные элементы из заказа (используя контроллер line_items, который у меня есть), могу ли я просто поместить «has_many: line_items через:: orders» в модель клиента, а затем ссылаться на него как на order.line_item. имя? – ecs

+1

Вероятно, вы не хотите ставить 'has_many through' на клиента для line_items, потому что line_items имеют смысл только в контексте их заказа (' has_many through' заставит клиента иметь большое ведро line_items, не зависящее от заказов). Если порядок has_many line_items, то, когда вы выполняете итерации по заказам (как указано выше) и имеете заданный порядок, вы можете выполнить 'order.line_items.each do | line_item |' и перебирать их как цикл в цикле. –

+0

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

0

В вашем шоу действия:

def show 
    @customer = Customer.find(params[:id]) 
    end 

В вашем routes.rb:

resources :customers 

На ваш взгляд:

<table> 
<% @customer.orders.each do |order| %> 
    <tr> 
    <td><%= order.id %></td> 
    <td><%= And Other Your Order Fields %></td> 
    </tr> 
<% end %> 
</table>