Может ли ActiveRecord создавать таблицы за пределами миграции?
Я работаю над веб-приложением без Rails, поэтому никаких миграций script по умолчанию.
The Sequel ORM позволяет мне легко создавать таблицы в 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
Есть ли способ сделать это с помощью ActiveRecord вне миграций?
Ответы
Ответ 1
Мое нынешнее понимание - нет, все изменения данных или схемы должны выполняться с помощью миграции. У меня полный файл rakefile на github, который можно использовать для выполнения миграции вне Rails.
В качестве альтернативы, если это всего лишь инициализация script, можно использовать следующее.
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
Ответ 2
В Rails 4 по крайней мере (возможно, раньше?) вы можете вызвать create table непосредственно на экземпляр ActiveRecord::ConnectionAdapters
, используя тот же синтаксис, что и перенос.
Вы можете получить соединение для своей базы данных (при условии, что у вас есть только одна база данных), вызывая ActiveRecord::Base.connection
. Итак, Ruby для вашего примера будет выглядеть так:
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
Примечание. Если у вас уже определена модель, и она использует ту же базу данных, что и та, в которой вы хотите создать таблицу, вместо этого вы можете захватить объект соединения. Для создания одноразовой таблицы в консоли я назову User.connection.create_table
просто потому, что она меньше набирает текст.