Rails导出csv模型有很多对很多

时间:2014-09-16 15:20:10

标签: ruby-on-rails model model-associations

您好我是Ruby on Rails的新手,我有一点问题。我正在尝试在csv文件中导出数据 Recibo 模型。但是这个模型模型与 Atencion 模型相关联。 所有 servicio_ids 我需要 Recibo 谢谢!

模型 Recibo

class Recibo < ActiveRecord::Base
  attr_accessible :caja_id, 
  :doctor_id, 
  :numero_recibo, 
  :paciente, 
  :total,
  :total_porcentaje_doctor,
  :total_porcentaje_clinica,
  :total_porcentaje_laboratorio, 
  :servicio_ids,
  :created_at,
  :updated_at

  belongs_to :caja
  belongs_to :doctor

  has_many :atencions
  has_many :servicios, :through => :atencions

  before_save do
    servicio_by_id = Servicio.where(:id => servicio_ids)

    self.total = servicio_by_id.sum(&:precio)

    self.total_porcentaje_doctor = servicio_by_id.sum ('porcentaje_doctor / 100.0 * precio')
    self.total_porcentaje_clinica = servicio_by_id.sum ('porcentaje_clinica / 100.0 * precio')
    self.total_porcentaje_laboratorio = servicio_by_id.sum ('porcentaje_laboratorio / 100.0 * precio')

  end

  def self.to_csv
    CSV.generate do |csv|
      csv << column_names
      all.each do |recibo|
        csv << recibo.attributes.values_at(*column_names)
      end
    end
  end

  def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
      recibo = find_by_id(row["id"]) || new
      recibo.attributes = row.to_hash.slice(*accessible_attributes)
      recibo.save!
    end
  end

end

模型Atencion

class Atencion < ActiveRecord::Base
  attr_accessible :recibo_id, 
  :servicio_id

  belongs_to :recibo
  belongs_to :servicio
end

唯一没有显示的列是servicio_ids。请帮帮我!

2 个答案:

答案 0 :(得分:0)

尝试recibo.atencions.map(&amp;:servicio_id)

recibo.atencions ==&gt;将得到与特定recibo相关的所有atencions map(&amp;:servicio_id)==&gt;将获得相关的atencions中的所有servicio_id

答案 1 :(得分:0)

这是我的解决方案!

  def self.to_csv
    CSV.generate do |csv|
      csv << ["id", "caja_id", "doctor_id", "numero_recibo", "paciente", "total", "total_porcentaje_laboratorio",
        "total_porcentaje_clinica", "total_porcentaje_doctor", "created_at", "updated_at", "servicio_ids" ]
      all.each do |recibo|
        recibo.atencions.map(&:servicio_id)
        csv << [recibo.id, recibo.caja_id, recibo.doctor_id, recibo.numero_recibo,
          recibo.paciente, recibo.total, recibo.total_porcentaje_laboratorio, recibo.total_porcentaje_clinica, 
          recibo.total_porcentaje_doctor, recibo.created_at, recibo.updated_at, recibo.servicio_ids]
      end
    end
  end