[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가 필요한 경우 다음을 참조하십시오.


답변

테이블이 존재하지 않더라도 :

모델 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?


답변