2010-03-01 7 views
10

Je travaille sur une application web non Rails, donc pas de script de migrations par défaut.ActiveRecord peut-il créer des tables en dehors d'une migration?

Le Sequel ORM me permet de créer des tables facilement dans 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 

Y at-il une todo façon dont cela avec ActiveRecord en dehors des migrations?

+0

Notez qu'avec les versions récentes de Sequel vous pouvez faire: DB.create_table? : messages faire primary_key: id varchar: titre text: body end Qui créera la table à moins qu'elle n'existe déjà. –

+0

Merci pour le conseil Jeremey – Morgan

Répondre

19

Ma compréhension actuelle est non, toutes les modifications de données ou de schémas doivent être effectuées via une migration. J'ai a complete rakefile on github qui peut être utilisé pour effectuer les migrations en dehors de Rails.

Alternativement, si ce n'est qu'un script d'initialisation, les éléments suivants peuvent être utilisés.

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

Est-ce que cette 'migration' créera une table seulement si elle est différente/n'existe pas? – nterry

+0

@nterry Je pense que ça va échouer si ça existe déjà. – Morgan

11

Dans Rails 4 au moins (peut-être plus tôt?), Vous pouvez appeler directement create table sur une instance ActiveRecord::ConnectionAdapters, en utilisant la même syntaxe que la migration.

Vous pouvez obtenir une connexion pour votre base de données (en supposant que vous ayez une seule base de données) en appelant ActiveRecord::Base.connection. Ainsi, le Ruby pour votre exemple ressemblerait à ceci:

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 

Note: Si vous avez déjà un modèle défini, et il utilise la même base que celle dans laquelle vous voulez créer la table, vous pouvez saisir une objet de connexion à partir de là à la place. Pour créer une table unique dans la console, j'appelle le User.connection.create_table simplement parce que c'est moins typé.

+0

Existe-t-il un moyen d'accéder au bloc stocké pour créer une table à partir de la définition de schéma? Je voudrais créer exactement la même table, juste dans une base de données différente en utilisant une connexion différente. – Hendrik

Questions connexes