检查Rails中是否存在表

时间:2011-07-05 23:45:11

标签: ruby-on-rails ruby rails-activerecord rails-migrations

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

AR是否有Table.exists等方法?如何确保他们已成功迁移表格?

5 个答案:

答案 0 :(得分:290)

在Rails 5中API became explicit regarding tables/views,统称​​数据源

# 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,请参阅:

答案 1 :(得分:54)

即使表不存在:

模型Kitten,预期表格kittens rails 3:

Kitten.table_exists? #=>假

答案 2 :(得分:32)

我在尝试通过迁移删除表时发现了这一点:

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则不执行任何操作。

答案 3 :(得分:6)

Rails 5.1

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

drop_table :table_name, if_exists: true

答案 4 :(得分:0)

执行此操作的正确方法是Model.table_exists?

class Dog < ApplicationRecord
  # something
end

do_something if Dog.table_exists?