将方法添加到reflection-object和named-scopes

时间:2010-02-20 17:02:33

标签: ruby-on-rails activerecord

我喜欢在我的has_many关系中添加一个方法,方法是将它应用于关系对象。
我收到了一份订单:has_many line_items
我喜欢写像 order.line_items.calculate_total # returns the sum of line_items
我可以这样做:
:has_many line_items do def calculate_total ... end end
但这不适用于像payalbes_only这样的named_scope:
order.line_items.payables_only.calculate_total
这里计算总数将收到所有line_items的订单,而不是来自paids_only-scope的范围。我的日志告诉我,paybles_only范围甚至没有应用于sql。

1 个答案:

答案 0 :(得分:1)

实现这一目标的一种方法是使用class_eval,例如:

Array.class_eval do
  def calculate_total
    total = 0
    self.each do |item|
      total = total + item.value if item.class.to_s == 'LineItem'
    end
    return total
  end
end