Сначала код:
create_table :users do |t|
...
t.boolean :is_active, :default => true
...
end
Теперь вот моя проблема - я создаю задачу rake для импорта БОЛЬШОГО количества записей (более 10000).Я провел обширное тестирование и бенчмаркинг и определил, что самый быстрый и эффективный способ выполнить эту задачу - создать один гигантский необработанный оператор SQL.(Я читаю данные из CSV).Как пример:
inserts = Array.new
FasterCSV.foreach(...) do |row|
inserts.push "(row[0], row[1]...)"
end
User.connection.execute "INSERT INTO users (...) VALUES #{inserts.join(", ")}"
Все отлично работает.Весь процесс завершается (буквально) секундами вместо 1,5 часов с использованием ActiveRecord.Однако моя проблема заключается в булевом поле.Я разрабатываю локально на SQLite, но MySQL на производстве.При использовании ActiveRecord, Rails определяет, что поместить в «логическое» поле (так как почти все базы данных разные).Я пишу пользовательский SQL, и я хочу знать, есть ли способ сделать что-то вроде ...
INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...)
..., которое правильно возвращает логическое значение для базы данных.
Любой, кто ответит «просто используя ActiveRecord», будет лишен голоса.Это просто НЕ осуществимо в этой ситуации.Я также не желаю использовать поле tinyint (1) и использовать 1 или 0.
Таким образом, значение is_active
необходимо изменить в зависимости от текущего подключения к базе данных ...
Возможно ли это?