web-dev-qa-db-ja.com

Railsにテーブルが存在するかどうかを確認します

テーブルが存在しない限り機能しないレーキタスクがあります。 Webサイトで20人以上のエンジニアと作業しているため、それぞれのテーブルにデータを取り込むレーキタスクを実行する前に、テーブルを移行したことを確認したいと思います。

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

165
thenengah

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は約tablesです。

# 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が必要な場合は、以下を参照してください。

293
captainpete

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

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

Kitten.table_exists? #=> false

54
alexey_the_cat

移行を介してテーブルを削除しようとしたときにこれを見つけました:

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は何もしません。

32
kangkyu

レール5.1

if ActiveRecord::Base.connection.data_source_exists? 'table_name'
   drop_table :table_name
end

または

drop_table :table_name, if_exists: true
6
Vitor Oliveira

これを行う適切な方法はModel.table_existsですか?

class Dog < ApplicationRecord
  # something
end

do_something if Dog.table_exists?
0
Juan Furattini