RAILS:使用范围返回计数并计算用户的百分比

时间:2014-07-29 10:20:44

标签: ruby-on-rails ruby

Class Order < ActiveRecord::Base

  scope :ordered, lambda { |user| where("orders.user_id = ?", user.id) }
  scope :delivered, lambda { |user| where("orders.user_id = ? and orders.delivered = ?", user.id, true) }

  def self.delivered_percentage (user)
    ((self.ordered(user).count/self.delivered(user).count) * 100)
  end

end

我有一个Order模型,我需要找出

  1. 订购商品的数量
  2. 已交付物品的数量
  3. 交付物品的百分比。
  4. ordered和deliver方法返回一个数组。如何让他们返回计数,并计算交付物品的百分比。

    在我的控制器中我想

    Order(current_user).delivered_percentage
    

    谢谢!

2 个答案:

答案 0 :(得分:1)

ordereddelivered返回ActiveRecord::Relation。如果在其上调用count,将返回SQL count查询的结果。因此,您的方法基本上应该可行 - 除非您必须将计数转换为浮点数才能使其正常工作:

def self.delivered_percentage(user)
  (ordered(user).count.to_f / delivered(user).count.to_f) * 100
end

你打电话给:

Order.delivered_percentage(current_user)

答案 1 :(得分:1)

Order.group('delivered').count

这将返回一个哈希:{true =&gt; 10,false =&gt; 33}使用单个SQL查询。

所以你应该能够做到这一点:

def self.delivered_percent(user)
  delivered_counts ||= Order.group('delivered').where(user: user).count
  delivered_counts[true]/delivered_counts.values.sum.to_f
end