使用范围在rails中进行数据格式化

时间:2016-10-25 09:50:00

标签: ruby-on-rails ruby activerecord

我有三个模型User,Order,OrderItem

class User < ApplicationRecord
  has_many :orders
end

class Order < ApplicationRecord
  belongs_to :user
  has_many :order_items
end 

class OrderItem < ApplicationRecord
  belongs_to :order
end

OrderItem包含字段金额,我需要以格式

获取特定用户的订单总金额
{{1=>23.5},{2=>213.5},{5=>123.5}}

其中1,2,3是订单ID,相应的值是特定订单的订单商品中所有金额的总和。

我需要这种数据来使用chartkick gem

显示图表

其中数据必须是任何一种形式,

<%= pie_chart({"Football" => 10, "Basketball" => 5}) %>
<%= pie_chart [["Football", 10], ["Basketball", 5]] %>

请参阅https://github.com/ankane/chartkick#data

所以我需要获得这种数据。

我已经通过

实现了它
  result = User.first.orders.select("orders.id, sum(order_items.amount) as charge").left_outer_joins(:order_items)

结果为[{"id"=>206, "charge"=>240000.0}, {"id"=>208, "charge"=>0.0}, {"id"=>210, "charge"=>120000.0}]

但是这可以通过使用循环转换为我提到的格式,但我不想要这种解决方案,我需要知道还有其他任何直接的方法。

1 个答案:

答案 0 :(得分:1)

在您的应用程序中尝试以下更改:

  
      
  1. 订购模式
  2.   
        def to_array
          [self.id, self.order_items.sum(:amount)]
        end
  

2.使用以下查询获取结果:

        current_user.orders.includes(:order_items).map(&:to_array) ##for single user order
                         ##OR##
        Order.all.map(&:to_array)  ##for all order
  
      
  1. 这将给出如下结果:
  2.   
        [[1, "100"]] ## id of your order and total sum of amount.

希望它能正常工作:)