テーブルが存在しない限り機能しないレーキタスクがあります。 Webサイトで20人以上のエンジニアと作業しているため、それぞれのテーブルにデータを取り込むレーキタスクを実行する前に、テーブルを移行したことを確認したいと思います。
ARにはTable.exists
などのメソッドがありますか?テーブルが正常に移行されたことを確認するにはどうすればよいですか?
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が必要な場合は、以下を参照してください。
ActiveRecord::Base
テーブルのschema_migrations
クラスですテーブルが存在しない場合でも:
モデルKitten
、予想されるテーブルkittens
Rails 3:
Kitten.table_exists? #=> false
移行を介してテーブルを削除しようとしたときにこれを見つけました:
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は何もしません。
レール5.1
if ActiveRecord::Base.connection.data_source_exists? 'table_name'
drop_table :table_name
end
または
drop_table :table_name, if_exists: true
これを行う適切な方法はModel.table_existsですか?
class Dog < ApplicationRecord
# something
end
do_something if Dog.table_exists?