我正在尝试从现有表列计算值并将其用于外部变量。
让我的表格列为:["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_1
和extras_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]))