ActiveRecord 可以在迁移之外创建表吗?
Posted
技术标签:
【中文标题】ActiveRecord 可以在迁移之外创建表吗?【英文标题】:Can ActiveRecord create tables outside of a migration? 【发布时间】:2011-01-22 11:13:33 【问题描述】:我正在开发一个非 Rails 网络应用程序,因此默认情况下没有迁移脚本。
Sequel ORM 让我可以在脚本中轻松创建表:
#!/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 做到这一点?
【问题讨论】:
请注意,使用最新版本的 Sequel 您可以执行以下操作:DB.create_table? :posts do primary_key :id varchar :title text :body end 这将创建表,除非它已经存在。 【参考方案1】:至少在 Rails 4 中(可能更早?),您可以直接在 ActiveRecord::ConnectionAdapters
实例上调用 create table,使用与迁移相同的语法。
您可以通过调用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
只是因为它减少了输入。
【讨论】:
【参考方案2】:我目前的理解是不,所有修改数据或架构都必须通过迁移来完成。我有a complete rakefile on github,可用于在 Rails 之外执行迁移。
或者,如果它只是一个初始化脚本,则可以使用以下内容。
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
【讨论】:
以上是关于ActiveRecord 可以在迁移之外创建表吗?的主要内容,如果未能解决你的问题,请参考以下文章
ActiveRecord 迁移未填充 Postgres 物化视图
在标准“生产”或“开发”之外的不同数据库上使用Rails迁移
如何在 Ruby on Rails ActiveRecord 迁移中处理过长的索引名称?