190

テーブルが存在しないと機能しないレーキ タスクがあります。私は Web サイトで 20 人以上のエンジニアと協力しているので、それぞれのテーブルに入力するレーキ タスクを実行する前に、彼らがテーブルを移行したことを確認したいと考えています。

ARには次のような方法がありTable.existsますか?テーブルが正常に移行されたことを確認するにはどうすればよいですか?

4

5 に答える 5

331

Rails 5 では、API はテーブル/ビュー、総称してデータ ソースに関して明示的になりました。

# Tables and views
ActiveRecord::Base.connection.data_sources
ActiveRecord::Base.connection.data_source_exists? 'kittens'

# Tables
ActiveRecord::Base.connection.tables
ActiveRecord::Base.connection.table_exists? 'kittens'

# Views
ActiveRecord::Base.connection.views
ActiveRecord::Base.connection.view_exists? 'kittens'

Rails 2、3、および 4 では、API はテーブルに関するものです。

# Listing of all tables and views
ActiveRecord::Base.connection.tables

# Checks for existence of kittens table/view (Kitten model)
ActiveRecord::Base.connection.table_exists? 'kittens'

移行のステータスを取得する:

# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions

# Tells you the current schema version
ActiveRecord::Migrator.current_version

移行またはメタデータ用にさらに API が必要な場合は、次を参照してください。

于 2011-07-05T23:49:49.843 に答える
60

テーブルが存在しない場合でも:

モデルKitten、予想されるテーブルkittens レール 3:

Kitten.table_exists? #=>偽

于 2012-01-31T14:48:58.183 に答える
36

移行によってテーブルを削除しようとしているときに、これを見つけました。

drop_table :kittens if (table_exists? :kittens)
ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens)

Rails 3.2で動作します

Rails 5 では、この単純な形式が利用可能になります。

drop_table :kittens, if_exists: true

参考:https ://github.com/rails/rails/pull/16366

Rails 5 ActiveRecord のCHANGELOGは次のとおりです。

drop_table に :if_exists オプションを導入。

例:

drop_table(:posts, if_exists: true)

それは実行されます:

DROP TABLE IF EXISTS posts

テーブルが存在しない場合、if_exists: false (デフォルト) は例外を発生させますが、if_exists: true は何もしません。

于 2015-05-29T17:56:16.663 に答える