Rails Active Record可以对select语句进行算术运算

时间:2016-10-21 06:03:29

标签: ruby-on-rails ruby-on-rails-3

我正在尝试从现有表列计算值并将其用于外部变量。

让我的表格列为:["id","unit_price","quantity","extras_1","extras_2"] 我正在使用sql命令作为参考来介绍我想在rails中做什么。

SQL命令:

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尝试基于派生属性进行排序。它工作得很好。但是我无法通过查询看到派生的属性值。

我得到的输出没有派生属性:

[#<OrderDetail >,#<OrderDetail >]

但我需要输出:

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

我尝试了以下查询来对数据进行排序。它完美地对数据进行了排序:

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')

以上命令有效,因为extras_1extras_2是表格列。

但它在分配给现有表列时有效。我需要派生属性为不存在的表列名。

如何从记录中访问派生属性值。我可以通过将它们分配给现有的表列来访问它们。但是我想要给出我想要的属性名称而不管表列。

2 个答案:

答案 0 :(得分: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 :(得分: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]))