16

Rails以外のWebアプリで作業しているため、デフォルトでは移行スクリプトはありません。

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

私の現在の理解はノーです。すべての変更データまたはスキーマは、移行を通じて実行する必要があります。Railsの外部で移行を実行するために使用できる完全なrakefileがgithubにあります。

あるいは、それが単なる初期化スクリプトである場合は、以下を使用できます。

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では、移行と同じ構文を使用して、インスタンス上でcreatetableを直接呼び出すことができます。ActiveRecord::ConnectionAdapters

を呼び出すことにより、データベースへの接続を取得できます(データベースが1つしかない場合)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

注:モデルがすでに定義されていて、テーブルを作成するデータベースと同じデータベースを使用している場合は、代わりにそこから接続オブジェクトを取得できます。コンソールでの1回限りのテーブル作成については、User.connection.create_table入力が少ないという理由だけで呼び出します。

于 2014-12-11T20:54:40.473 に答える