2016-07-10 4 views
0

В настоящее время у меня есть модель Order, OrderItems и Products. Я хочу определить метод под названием subtotal в OrderItems, который будет возвращать значение количества, умноженное на цену (через отношение product.price).Определение методов модели в Rails

Как я мог это сделать? Я не знаю, как обращаться к столбцам и столбцам через отношения.

class OrderItem < ActiveRecord::Base 
belongs_to :order 
belongs_to :product 

validates :order_id, presence: true 
validates :product_id, presence: true 

def subtotal 
    quantity * product.price 
end 
end 

Таблица схемы

create_table "order_items", force: :cascade do |t| 
t.integer "product_id" 
t.integer "order_id" 
t.integer "quantity" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
end 

Спасибо за вашу помощь.

+0

Рассмотрим пост здесь, по крайней мере схема 'OrderItems' таблицы. – developer033

+0

Спасибо, сделано .. –

+0

Я имею в виду столбцы вашего стола ... – developer033

ответ

0

Немного неуверен об отношениях между ТоварыЗаказом и продуктами, но если вы сделали belongs_to: products в вашем models/OrderItems.rb, то вы можете просто сделать quantity * product.price

+0

Это то, что я изначально сделал, но я получил ошибку ** неопределенный метод '* 'для nil: NilClass ** .. –

+0

Это означает, что количество не задано в вашем OrderItem. Может быть хорошей идеей добавить проверку на 'количество' на вашу модель OrderItem. Что-то вроде 'validates_numerical_of: quantity, only_integer: true, more_than: 0' –

+0

Вы получили его! Это происходило, потому что у меня было несколько предметов без набора количества. Большое спасибо :) –

0

Я думаю, что в вашей модели заказа вы имеете отношение следующим образом,

has_many :order_items 

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

Определите метод total_price в классе OrderItem.

def total_price 

    tot_price = self.product.price * self.quantity 

    tot_price 
end 

, то вы можете назвать его следующим

order = Order.first 
total_price = order.order_items.sum(&:total_price) 
Смежные вопросы