2016-10-21 2 views
0

Я пытаюсь вычислить значения из существующего столбца таблицы и использовать его во внешней переменной.Rails Active Record, чтобы сделать арифметические вычисления над оператором select

Позвольте моим столбцам таблицы быть такими: ["id","unit_price","quantity","extras_1","extras_2"] Я представляю, что я хочу делать в рельсах, используя команду sql в качестве ссылки.

SQL Command:

SELECT unit_price*quantity AS "regular_price", 
     unit_price*quantity-unit_price*quantity*discount AS "price_after_discount" 
FROM order_details; 

В Rails Active Record Query я пробовал такое же, как:

OrderDetail.select('unit_price*quantity AS regular_price,unit_price*quantity-unit_price*quantity*discount AS price_after_discount') 

Из приведенной выше query.i судимой сортировки, основываясь на полученном attributes.it работал perfectly.But я не может видеть значения полученных атрибутов путем запроса.

Выход я получил без производных атрибутов, как:

[#<OrderDetail >,#<OrderDetail >] 

Но мне нужно вывод, как:

[#<OrderDetail regular_price: 43, price_after_discount: 54>,#<OrderDetail regular_price: 54, price_after_discount: 76>] 

Я попытался ниже запрос, чтобы отсортировать data.It отлично отсортирован данные:

OrderDetail.select('unit_price,quantity,unit_price*quantity AS regular_price,unit_price*quantity-unit_price*quantity*discount AS price_after_discount').order('regular_price desc') 

я могу получить доступ к данным с помощью следующей команды:

OrderDetail.select('unit_price,quantity,unit_price*quantity AS extras_1,unit_price*quantity-unit_price*quantity*discount AS extras_2') 

над commmand работал потому, что extras_1 и extras_2 - столбец таблицы.

Но он работает, если назначен существующему столбцу таблицы. Мне нужно, чтобы производный атрибут был несуществующим именем столбца таблицы.

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

ответ

1

Вы не сможете найти производные (псевдонимы) атрибуты. Но они присутствуют.

OrderDetail.select('unit_price*quantity AS regular_price,unit_price*quantity-unit_price*quantity*discount AS price_after_discount').first.regular_price 

Будет печать regular_price.

То, что вы видите в консоли rails, выводится методом inspect. inspect метод не реализован для отображения атрибутов псевдонимов. Отсюда возникает путаница.

Перейти через этот документ: http://apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/select

Если был указан псевдоним, он будет доступен из полученных объектов:

Model.select('field AS field_one').first.field_one 
#=> "value" 
1

Ваши атрибуты вполне доступны. Просто позвоните им!:)

В качестве дополнительного замечания я предлагаю вам использовать более современный способ написания запроса:

class OrderDetail 
    scope :with_calculated_prices, -> do 
    regular_price = (arel_table[:unit_price] * arel_table[:quantity]) 
    price_after_discount = (regular_price - regular_price * arel_table[:discount]) 
    select(regular_price.as('regular_price'), price_after_discount.as('price_after_discount'))} 
end 

price_after_discount лучше определяется как

price_after_discount = (regular_price * (1 - arel_table[:discount])) 
Смежные вопросы