2010-12-27 19 views
15

Código primera:Rieles de base de datos valores booleanos

create_table :users do |t| 
    ... 
    t.boolean :is_active, :default => true 
    ... 
end 

Ahora, aquí es mi problema - Estoy creando una tarea rastrillo para importar un número grande de registros (10.000). Hice pruebas exhaustivas y evaluaciones comparativas, y determiné que la manera más rápida y eficiente de realizar esta tarea es crear una declaración SQL en bruto gigante. (Estoy leyendo datos de CSV). Como ejemplo:

inserts = Array.new 
FasterCSV.foreach(...) do |row| 
    inserts.push "(row[0], row[1]...)" 
end 
User.connection.execute "INSERT INTO users (...) VALUES #{inserts.join(", ")}" 

Todo funciona genial. Todo el proceso se completa en (literalmente) segundos en lugar de las 1.5 horas que usan ActiveRecord. Sin embargo, mi problema radica en el campo booleano. Desarrollo localmente en SQLite, pero MySQL en producción. Al usar ActiveRecord, Rails determina qué poner en el campo "booleano" (ya que casi todas las bases de datos son diferentes). Estoy escribiendo SQL personalizado y quiero saber si hay alguna manera de hacer algo así ...

INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...) 

... que devuelve correctamente el valor booleano-base de datos específica.

Cualquiera que responda "solo usando ActiveRecord" será votado negativamente. Simplemente NO es posible en esta situación. Tampoco estoy dispuesto a usar un campo tinyint (1) y uso 1 o 0.

En resumen, el valor de is_active tiene que cambiar en base a la conexión de base de datos actual ...

Es esto posible?

+0

¿Por qué no desarrolla localmente con MySQL? Eso resolvería este problema, junto con otras incompatibilidades. La forma en que generalmente trato con booleanos es usar una declaración preparada, pero no funcionará para ti. –

+0

Eso no responde mi pregunta sin embargo. ¿Qué pasa si quiero usar POSTgres o MSSQL en algún momento? – sethvargo

Respuesta

31

creo que podría estar buscando ActiveRecord::Base.connection.quoted_true

Esto devuelve valores booleanos nativas entre comillas, por ejemplo, '1' para SQL Server o MySQL, y 't' para PostgreSQL o SQLite

+0

¡Muchas gracias! ¿Cómo/dónde encontraste esto? Además, puede valer la pena editar su respuesta (solo para otras personas que puedan tener este problema) mencionar que incluye automáticamente las comillas ('). Por ejemplo, si la conexión es sqlite, devuelve 't' no solo t. – sethvargo

+2

Heh, para encontrarlo, me divertí mirando los códigos para los adaptadores de conexión ActiveRecord. – Scott

+1

Solo para mayor claridad: puede usar self.connection.quoted_ * en métodos de clase y self.class.connection.quoted_ * en métodos de instancia. –

Cuestiones relacionadas