模型中的Rails 4自定义方法,没有控制器

时间:2015-08-14 17:56:43

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我在Rails 4应用程序中有3个相关模型 - 收费:

class Charge < ActiveRecord::Base
  belongs_to :rate
  belongs_to :shift

  def total
    self.rate.value * self.quantity
  end

end

率:

class Rate < ActiveRecord::Base
  has_many :charges
end

和Shift:

class Shift < ActiveRecord::Base
  has_many :charges

  def total_charge
    self.charges.sum('total')
  end

end

我试图在我的视图中使用shift.total_charge,但我收到了错误:

SQLite3::SQLException: no such column: total: SELECT SUM(total) FROM "charges" WHERE "charges"."shift_id" = ?

因此似乎不可能以这种方式在Charge模型中定义total,并且可以从Shift模型中将其作为实际列的总和。我正在努力寻找合适的Rails 4方法 - 是否可以在模型中执行此操作,或者我是否需要为Charge创建控制器并尝试在那里进行计算?

1 个答案:

答案 0 :(得分:1)

sum仅适用于列。你可以使用像

这样的东西
class Shift < ActiveRecord::Base
  has_many :charges

  def total_charge
    self.charges.map {|c| c.rate.value * c.quantity }.sum
  end
end

并避免n + 1问题包括Rate

中的Charge
class Charge < ActiveRecord::Base

  belongs_to :rate
  belongs_to :shift

  default_scope {includes :rate}
end