16

我正在开发一个非 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 来做到这一点?

4

2 回答 2

22

我目前的理解是不,所有修改数据或模式都必须通过迁移来完成。我在 github 上有一个完整的 rakefile,可用于在 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
于 2010-04-03T08:05:40.917 回答
19

至少在 Rails 4 中(可能更早?),您可以直接在实例上调用create tableActiveRecord::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它只是因为它的输入更少。

于 2014-12-11T20:54:40.473 回答