在轨道上的红宝石中的项目总和

时间:2014-04-17 18:48:05

标签: ruby-on-rails ruby sum items

我是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

谢谢!

2 个答案:

答案 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