我有一个rake任务,除非存在一个表,否则它将无效。我正在一个网站上与20多名工程师一起工作,所以我想确保他们已经迁移了表,然后才能执行一个rake任务,该任务将填充相应的表。
AR有像Table.exists
这样的方法吗?如何确保他们已成功迁移表?
在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,请参阅:
ActiveRecord::Base
表的schema_migrations
类即使表不存在:
模型Kitten
,预期表kittens
rails 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(默认值)引发异常,而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
正确的方法是Model.table_exists?
class Dog < ApplicationRecord
# something
end
do_something if Dog.table_exists?