Rails Seed DB из CSV - проблема с форматом даты - PullRequest
1 голос
/ 18 ноября 2011

(Вот моя необходимая строка о том, чтобы быть новичком в ruby ​​/ rails и программировании в целом; также первый вопрос SO)

У меня есть задача rake, чтобы заполнить мою MySQL DB из CSV-

...
    CSV.read(uri).each do |row|
      Incident.create(
        :building_address => row[9],
        :agency => row[3],
        :complaint_type => row[6],
        :descriptor => row[5],
        :created => row[1],
        :closed => row[2],
        )
end

:created и :closed определены как поля даты (и также не связаны с полями созданного рельса и не связаны с рельсами), но я предполагаю, что файлы CSV распознают только строки.

Когда я запускаю это задание, день и месяц меняются местами.Таким образом, 1/12/2010 12:00:00 AM в CSV (что для CSV и меня в США означает 12 января) в конечном итоге анализируется как 2010-12-1, и любой день после 12 возвращает ноль, поэтому 1/20/2010 12:00:00 AM приводит к пустой записи вмоя БД.

Я добавил

date:
    formats:
        default: "%m/%d/%Y"

в свой en.yml, но это, похоже, влияет только на отображение даты и не влияет на создание объектов через мои граблизадача.После поиска по SO и другим ресурсам я попытался

:created => row[1].strftime,

и

:created => row[1].strptime,

, но получил undefined method strptime/strftime for "Created Date":String (Дата создания - это имя столбца в CSV).

Поэтому я также попытался

:created => row[1].to_date

изменить (предположительно) строку «date» в CSV на дату, но получил ошибку undefined method '<' for nil:NilClass

Изменениеполе даты в CSV кажется незапускаемым, так как существует более 1 миллиона записей.

Как я могу отредактировать эту задачу с граблями, чтобы правильно заполнить мою базу данных из этого CSV?Или я должен изменить: созданный из даты в строку и манипулировать им в логике приложения?

1 Ответ

1 голос
/ 18 ноября 2011

Вы можете попробовать использовать DateTime.strptime для преобразования ваших строк в экземпляры DateTime:

:created => DateTime.strptime(row[1], '%m/%d/%Y %H:%M:%S %p'),
:closed  => DateTime.strptime(row[2], '%m/%d/%Y %H:%M:%S %p')

Метод класса strptime позволит вам точно указать формат, который вы используететак что никто из софта не должен догадываться.Я бы порекомендовал вам придерживаться ISO 8601 форматов даты и времени для внутреннего использования в будущем, оставьте неоднозначные форматы для потребления человеком.

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