我是Ruby on Rails的新手。这是我的模特,但我不知道如何解决。
class Recibo < ActiveRecord::Base
attr_accessible :caja_id,
:doctor_id,
:numero_recibo,
:paciente_id,
:total,
:total_porcentaje_doctor,
:total_porcentaje_clinica,
:total_porcentaje_laboratorio,
:servicio_ids
belongs_to :caja
belongs_to :doctor
belongs_to :paciente
has_many :atencions
has_many :servicios, :through => :atencions
before_save do
servicio_by_id = Servicio.select("precio,
porcentaje_doctor,
porcentaje_clinica,
porcentaje_laboratorio").where(:id => servicio_ids).to_a
self.total = servicio_by_id.sum(&:precio)
self.total_porcentaje_doctor = servicio_by_id.sum(&(:porcentaje_doctor) * (:price))
self.total_porcentaje_clinica = servicio_by_id.sum(&:porcentaje_clinica)
self.total_porcentaje_laboratorio = servicio_by_id.sum(&:porcentaje_laboratorio)
end
end
总数很好但是total_porcentaje_doctor不是!
错误是:
未定义的方法`*&#39; for:porcentaje_doctor:Symbol
谢谢!
答案 0 :(得分:1)
由于您使用数组中的两列进行计算,我认为您需要将此行写为:
self.total_porcentaje_doctor = servicio_by_id.sum { |x| (x.porcentaje_doctor * x.precio) }
答案 1 :(得分:1)
看起来你有一些总和计算的开销,而不是将所有对象加载到内存,你可以只计算数据库级别的总和并得到结果。
scoped_sercvio = Servicio.where(:id => servicio_ids)
self.total_porcentaje_clinica = scoped_sercvio.sum(:porcentaje_clinica)
您甚至可以进行嵌套计算,例如数据库级别的乘法运算。例如
self.total_porcentaje_doctor = scoped_sercvio.sum('porcentaje_doctor * price')
机器人写了关于它的文章,你可以在这里查看http://robots.thoughtbot.com/refactoring-ruby-iteration-patterns-to-the-database