2016-06-18 3 views
0

У меня есть одна проблема, когда я пытаюсь сохранить некоторые данные в моей базе данных, импортированные из файла CSV (загруженные).Загрузка файла csv и сохранение в базе данных

Мое окружение - это бронирование в классе. У меня есть следующий код для моей модели Reservation:

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 number» появился из столбца таблицы классов. Моя задача - получить classroom.id с помощью «числа» и создать строку в базе данных таблицы резервирования.

Хорошо, но проблема в том, что я получаю classroom_id в методе self.import и печатаю на консоли, он существует. Когда я использую область действия для фильтрации classroom_id, он пуст.

Ожидайте, что я выразил себя так, как хочу.

Извините за мой плохой английский:/

Edit: Обнаружено, что classroom_id перед тем Reservation.create стать nil, когда я использую внутри методу создания. Если я использую row[0] работ, но мне нужно использовать classroom_id.

ответ

0
{ where 'classroom_id = ?' % room_id } 

Должно быть

{ where 'classroom_id = ?', room_id } 
+0

проблема остается:/ Если поместить 'помещает room_id' ниже' ROOM_ID = Classroom.where (номер: строка [0]). pluck (: id) ', появится room_id. Но если я помещаю 'puts classroom_id' под' def validate_room', переменная пуста. – gumaro

+0

Я обнаружил, что room_id существует, но когда я помещаюсь в метод «create», он поворачивается на «nil», но если я использую строку [0], работает. К сожалению, строка [0] не является значением, которое я должен использовать. Вы знаете что-то о том, что я могу сделать? – gumaro

0

Ответ прост, я забыл использовать .first после pluck(:id) метода.

Метод срывать возвращает значение, завернутые в массиве:

room_id = Classroom.where(number: row[0]).pluck(:id).first 
Смежные вопросы