检查一个表是否存在于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
- attr_accessible(* attributes)和attr_protected(* attributes)有什么区别?
- 如何在Rails的activerecord模型中为属性创build默认值?
- ActiveRecord :: StatementInvalid:PG InFailedSqlTransaction
- Rails的ActiveRecord查询不等于
- 重写ActiveRecord属性方法
- MongoDB与MySQL
- has_many,belongs_to在活动logging移动轨道中的关系4
- 何时(如果)整合ActiveRecord迁移?
- ActiveRecord的Rails 3范围与类的方法