2010-03-01 12 views
10

Estoy trabajando en una aplicación web que no sea de Rails, por lo que no hay script de migraciones por defecto.¿Puede ActiveRecord crear tablas fuera de una migración?

The Sequel ORM me permite crear tablas fácilmente en un script:

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sequel' 

## Connect to the database 
DB = Sequel.sqlite('./ex1.db') 

unless DB.table_exists? :posts 
    DB.create_table :posts do 
    primary_key :id 
    varchar :title 
    text :body 
    end 
end 

¿Hay una manera de TODO esto con ActiveRecord fuera de las migraciones?

+0

Tenga en cuenta que con las versiones recientes de Sequel puede hacer: DB.create_table? : Mensajes hacen primary_key: Identificación del varchar: título texto: cuerpo final que creará la tabla a menos que ya existe. –

+0

Gracias por el consejo Jeremey – Morgan

Respuesta

19

Mi comprensión actual es no, todos los datos o esquemas de modificación deben realizarse a través de una migración. Tengo a complete rakefile on github que se puede usar para realizar migraciones fuera de Rails.

De forma alternativa, si solo se trata de un script de inicialización, se podría utilizar lo siguiente.

ActiveRecord::Base.establish_connection(
    :adapter => 'sqlite3', 
    :database => './lesson1_AR.db' 
) 

ActiveRecord::Migration.class_eval do 
    create_table :posts do |t| 
     t.string :title 
     t.text :body 
    end 

    create_table :people do |t| 
     t.string :first_name 
     t.string :last_name 
     t.string :short_name 
    end 

    create_table :tags do |t| 
     t.string :tags 
    end 
end 
+0

¿Esta 'migración' creará una tabla solo si es diferente/no existe? – nterry

+0

@nterry Creo que fallará si ya existe. – Morgan

11

En los carriles al menos 4 (posiblemente antes?), Puede llamar directamente create table en una instancia ActiveRecord::ConnectionAdapters, utilizando la misma sintaxis que la migración.

Puede obtener una conexión para su base de datos (suponiendo que tenga una sola base de datos) llamando al ActiveRecord::Base.connection. Por lo tanto, el Rubí por su ejemplo se vería así:

unless ActiveRecord::Base.connection.table_exists?(:posts) 
    ActiveRecord::Base.connection.create_table :posts do |t| 
    # :id is created automatically 
    t.string :title 
    t.text :body 
    end 
end 

Nota: Si ya tiene un modelo definido, y se utiliza la misma base de datos como una en la que desea crear la tabla, se puede tomar una objeto de conexión desde allí en su lugar. Para la creación de tablas únicas en la consola, llamaré a User.connection.create_table simplemente porque es menos tipeo.

+0

¿Hay alguna forma de cómo podría acceder al bloque almacenado para crear una tabla desde la definición del esquema? Me gustaría crear exactamente la misma tabla, solo en una base de datos diferente usando una conexión diferente. – Hendrik

Cuestiones relacionadas