Peut-ActiveRecord créer des tables à l'extérieur d'une migration?
-
23-09-2019 - |
Question
Je travaille sur une application web non Rails, donc pas de script migrations par défaut.
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?
La solution
Ma compréhension actuelle est pas, toutes les données de modifications ou d'un schéma doivent être fait par le biais d'une migration. Je un rakefile complet sur github qui peut être utilisé pour effectuer les migrations en dehors des rails.
Par ailleurs, si elle est juste un script d'initialisation pourrait être utilisé comme suit.
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
Autres conseils
Dans Rails 4 au moins (peut-être plus tôt?), Vous pouvez appeler créer Table directement 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 avez 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
Remarque: Si vous avez déjà un modèle défini et utilise la même base que celle dans laquelle vous voulez créer la table, vous pouvez saisir un objet de connexion à partir de là au lieu. Pour une large création de la table dans la console, je vais appeler User.connection.create_table
simplement parce qu'il est moins taper.