上传csv文件并保存在数据库中

时间:2016-06-18 15:40:50

标签: ruby-on-rails ruby

当我尝试将一些数据保存到我的数据库中时,我遇到了一个问题,从CSV文件导入(上传)。

我的环境是关于课堂预订。我的模型预订有以下代码:

class Reservation < ActiveRecord::Base
  require 'csv'

  belongs_to :classroom

  validates :start_date, presence: true
  validates :end_date, presence: true
  validates :classroom_id, presence: true
  validate :validate_room

  scope :filter_by_room, ->(room_id) { where 'classroom_id = ?' % room_id }

  def self.import(file)
    CSV.foreach(file, headers: true ) do |row|

      room_id = Classroom.where(number: row[0]).pluck(:id)

      Reservation.create(classroom_id: room_id, start_date: row[1], end_date: row[2])
    end
  end

  private
    def validate_room
      if Reservation.filter_by_room(classroom_id).nil?
        errors.add(:classroom_id, ' has already booked')
      end
    end
end

CSV文件附带以下三个标题:“教室编号”,“开始日期”,“结束日期”。 请注意,“教室编号”标题来自一列教室表。 我的工作是使用“数字”获取classroom.id并在预订表的数据库中创建行。

好的,但问题是当我用“self.import”方法获取classroom_id并在控制台上打印时,他就存在了。当我使用范围来过滤教室_id时,他是空的。

期待我表达自己的意思。

抱歉我的英文不好:/

修改:当我在create方法中使用时,classroom_id变为Reservation.create之前发现nil。如果我使用row[0]有效,但我需要使用classroom_id

2 个答案:

答案 0 :(得分:0)

{ where 'classroom_id = ?', room_id }

应该是

{{1}}

答案 1 :(得分:0)

答案很简单,我忘了在rails c #-> to go to the console ActiveRecord::Migration.drop_table(:users) #-> to delete users table exit #-> to exit console 方法之后使用.first

pluck方法返回一个包含在数组中的值:

pluck(:id)