检查一个表是否存在于Rails中

我有一个rake任务,除非有一个表存在,否则不能工作。 我正在一个网站上与20多名工程师合作,所以我想确保他们已经迁移了表格,然后才能执行将填充相应表格的rake任务。

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
    这是schema_migrations表的ActiveRecord::Base
  • 的ActiveRecord ::迁移
    所有的行动都是在迁移运行时发生的

即使表格不存在:

模型Kitten ,预计表kittens轨道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(默认值)引发exception,而if_exists:true则不执行任何操作。

Rails 5.1

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

要么

 drop_table :table_name, if_exists: true