在ruby中逐块添加

blo*_*ilk 3 ruby ruby-on-rails

我不久前在使用块格式化MySQL查询时发布了一个类似的问题并获得了非常好的响应,但它们对于手头的问题非常具体.这一次,我正在处理.sum()在表中获取行的问题.这就是我现在所拥有的:

def balance
  balance = 0
  items.each do |item|
    balance = balance + item.charges.sum(:revenue, :conditions => ['created_at >= ?', Time.now.beginning_of_month])
  end
  balance
end
Run Code Online (Sandbox Code Playgroud)

我的目标是获得给定用户本月所有费用的总和.费用属于属于用户的项目.我确信在Ruby/Rails中有更好的方法.

你会怎么做?

Ian*_*les 5

可以进行直接转换:

def balance
  conds = ["created_at > ?", Time.now.beginning_of_month]
  items.inject(0) do |total, item|
    total + item.charges.sum(:revenue, :conditions => conds)
  end
end
Run Code Online (Sandbox Code Playgroud)

可能有更多最佳方法取决于您的关系如何绘制出来.例如,您可以执行以下操作:

def balance
  Charge.sum :revenue,
    :conditions => ["charges.item_id IN (?) AND created_at > ?",
      items.map { |item| item.id },
      Time.now.beginning_of_month]
end
Run Code Online (Sandbox Code Playgroud)

对于这类情况,map,inject,select,等等,是非常宝贵的工具. 这里有关于注入的冗长讨论,并且有关更多信息,请参阅可枚举模块的RDoc.