Ответ 1
Я считаю, что вы можете искать ActiveRecord::Base.connection.quoted_true
Это возвращает исходные булевские значения в кавычках, например. '1' для SQL Server или MySQL и 't' для PostgreSQL или SQLite
Сначала код:
create_table :users do |t|
...
t.boolean :is_active, :default => true
...
end
Теперь, вот моя проблема. Я создаю задачу rake для импорта БОЛЬШОГО количества записей (10 000+). Я провел обширное тестирование и сравнительный анализ и решил, что самый быстрый и эффективный способ выполнения этой задачи - создать один гигантский 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 определяет, что вводить в поле "boolean" (поскольку почти все базы данных разные). Я пишу пользовательский SQL, и я хочу знать, есть ли способ сделать что-то вроде...
INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...)
..., который корректно возвращает логическое значение, специфичное для базы данных.
Любой, кто отвечает "просто используя ActiveRecord", будет проголосован. В этой ситуации это просто невозможно. Я также не хочу использовать поле tinyint (1) и использовать 1 или 0.
Таким образом, значение для is_active
необходимо изменить на основе текущего соединения с базой данных...
Возможно ли это?
Я считаю, что вы можете искать ActiveRecord::Base.connection.quoted_true
Это возвращает исходные булевские значения в кавычках, например. '1' для SQL Server или MySQL и 't' для PostgreSQL или SQLite