我在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创建控制器并尝试在那里进行计算?
答案 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