【问题标题】:Can ActiveRecord create tables outside of a migration?ActiveRecord 可以在迁移之外创建表吗?
【发布时间】: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 这将创建表,除非它已经存在。

标签: database orm activerecord sql create-table


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 2021-10-09
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多