190

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

AR 有没有这样的方法Table.exists?如何确保他们已成功迁移表?

4

5 回答 5

331

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

于 2011-07-05T23:49:49.843 回答
60

即使表不存在:

型号Kitten,预期桌kittens 轨 3:

Kitten.table_exists?#=> 假

于 2012-01-31T14:48:58.183 回答
36

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

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 什么也不做。

于 2015-05-29T17:56:16.663 回答
11

导轨 5.1

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

或者

drop_table :table_name, if_exists: true
于 2016-12-16T18:14:20.317 回答
2

正确的方法是 Model.table_exists?

class Dog < ApplicationRecord
  # something
end

do_something if Dog.table_exists?
于 2018-10-10T20:39:03.003 回答