Rails从csv导入数据,数组多对多

时间:2014-09-17 14:52:48

标签: ruby-on-rails csv import many-to-many

早上好!我的英语不是最好的。 我尝试使用此模型从csv文件导入一些数据。

class Recibo < ActiveRecord::Base
  attr_accessible :id,
  :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 << ["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

  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

我的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
    1,2,3,,Nombre,8,0,4,4,2014-04-21 15:45:29 -0500,2014-05-27 18:58:54 -0500,[1]
    2,2,1,,Nombre2,11,0,5.5,5.5,2014-04-21 16:38:32 -0500,2014-05-27 19:28:20 -0500,[1, 8]

self.import(文件) 假设在表中添加记录 servicio_ids atencion 但它没有。我不知道该怎么做。

感谢您的一切!

1 个答案:

答案 0 :(得分:0)

生成.csv文件时,而不是:

CSV.generate do |csv|

做的:

CSV.generate(force_quotes: true) do |csv|

默认情况下,CSV会在值之间添加逗号,因为数组元素中包含逗号,因此会影响您的解析。