2010-07-13 4 views
2

Я пишу процедуру импорта, которая позволит пользователю загрузить файл CSV для загрузки своей базы данных. Каждая строка CSV соответствует модели .Импорт - csv to activerecord - обработка ошибок в Rails

Я использую FasterCSV, чтобы прочитать файл и разделить данные на отдельные модели, которые отлично работают. У меня просто возникают проблемы с выбором лучшего подхода к обработке ошибок.

Прямо сейчас я это происходит, но это действительно кажется мне неправильным:

def import(collection) 
    begin 
    self.transaction do 
     collection.collect{|object| object.save!} 
    end 
    rescue ActiveRecord::RecordInvalid => invalid 
    return false 
    end 

    return true 
end 

Есть ли лучше способ сохранить коллекцию моделей?

ответ

4

Использование исключения в цикле вызовет для вас все виды головных болей, когда вы хотите отслеживать проблемную запись. Что вы можете сделать, это попытаться спасти их всех, но сообщать о тех, с ошибками:

def import(collection) 
    failed = nil 

    transaction do 
    failed = collection.reject { |r| r.save } 

    unless (failed.empty?) 
     raise ActiveRecord::Rollback 
    end 
    end 

    failed 
end 

Это предполагает, что вы заинтересованы в том, чтобы посмотреть на наличие ошибок. Если какие-либо записи не удались, они будут возвращены в массиве. В противном случае вы получите нуль, что означает отсутствие ошибок.

Если вы не заботитесь, вы всегда можете просто сделать быстро и грязно, кроме:

def import(collection) 
    transaction do 
    collection.each(&:save!) 
    end 
end 

Это вызовет в ActiveRecord :: RecordInvalid исключение для первого отказа.

0

По этой проблеме я считаю, что лучший подход - ваш. Возможно, не все записи в csv aré go yo validare, и те, которые не имеют значения (зарегистрируйте их, чтобы узнать об ошибках)

Смежные вопросы