[ruby-on-rails] Rails에 테이블이 있는지 확인
테이블이 없으면 작동하지 않는 갈퀴 작업이 있습니다. 웹 사이트에서 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는 테이블 에 관한 것 입니다.
# 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 :: SchemaMigration
이것은 테이블 의ActiveRecord::Base
클래스입니다schema_migrations
-
마이그레이션이 실행될 때 모든 작업이 수행되는 ActiveRecord :: Migrator
답변
테이블이 존재하지 않더라도 :
모델 Kitten
, 예상 테이블 kittens
레일 3 :
Kitten.table_exists? # => 거짓
답변
마이그레이션을 통해 테이블을 제거하려고하는 동안 이것을 발견했습니다.
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?