Импорт - csv в activerecord - обработка ошибок в Rails - PullRequest
2 голосов
/ 14 июля 2010

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

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

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

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

  return true
end

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

Ответы [ 2 ]

4 голосов
/ 14 июля 2010

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

 def import(collection)
   failed = nil

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

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

   failed
 end

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

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

0 голосов
/ 14 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...