Логические значения базы данных Rails - PullRequest
15 голосов
/ 28 декабря 2010

Сначала код:

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 необходимо изменить в зависимости от текущего подключения к базе данных ...

Возможно ли это?

1 Ответ

31 голосов
/ 28 декабря 2010

Я полагаю, что вы, возможно, ищете ActiveRecord::Base.connection.quoted_true

. Возвращает собственные логические значения в кавычках, например, «1» для SQL Server или MySQL и «t» для PostgreSQL или SQLite

...