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 物化视图

带有 UUID 主键的 ActiveRecord 迁移

在标准“生产”或“开发”之外的不同数据库上使用Rails迁移

如何在 Ruby on Rails ActiveRecord 迁移中处理过长的索引名称?

有没有办法在后续 Rails 3 ActiveRecord 迁移中删除 id 列?

如何编写迁移以重命名 Rails 中的 ActiveRecord 模型及其表?