Вопрос

I have two classes, orders and beverages - orders has_one beverage and beverage has_many orders. The Orders table has a beverage_id field which populates correctly when I create.

However, I'm really struggling to get the name of the beverage to display in the Orders#index rather than just the ID. I feel like I'm really overcomplicating things - what's the cleanest way in rails to make this (basic functionality) work?

Controller:

  def index
    @orders = Order.all
    @beverage = Order.beverage.find(params[:beverage_id])
  end

View

  - @orders.each do |order|
    %tr
      %td
        = order.created_at
      %td
        = order.orderable_type
      %td
        = order.quantity
        = order.beverage.name

At the moment, it just gives me

undefined method `beverage' for #

Have I done something wrong somewhere?

Это было полезно?

Решение

I have two classes, orders and beverages - orders has_one beverage and beverage has_many orders.

You should have:

  • beverage has_many :orders
  • order belongs_to :bavarage

So, your classes are probably set in a wrong way. You must have something like.

 class Beverage < ActiveRecord::Base
   has_many :orders   
 end

 class Order < ActiveRecord::Base
   belongs_to :beverage
 end

Otherwise, order.beverage.name will never work.

You can also remove the @beverage = Order.beverage.find(params[:beverage_id]) from your controller, as you are apparently not using it.

Другие советы

Once you set up your models as gabriel suggested you can do:

@orders = Order.includes(:beverage)
# retrieves all orders, including their beverage
# then you can loop through them like you did before

or:

@beverage = Beverage.includes(:orders).find(params[:id])
# retrieves a specific beverage + all its orders
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top