如何在Rake任务中使用ActiveRecord的迁移DSL?

时间:2015-07-16 09:10:54

标签: ruby-on-rails activerecord rake database-migration

我需要执行一些数据库操作,例如创建表,添加索引等。我想使用迁移中使用的相同方法,例如create_tableadd_index等。但是,当我试试这个

NoMethodError: undefined method `add_index' for main:Object

我在文件的开头添加了这个:

include ActiveRecord::ConnectionAdapters::SchemaStatements

但是,现在我收到以下错误:

NameError: undefined local variable or method `allowed_index_name_length' for main:Object

这在ActiveRecord::ConnectionAdapters::DatabaseLimits中定义。我尝试包含ActiveRecord::ConnectionAdapters,但它没有像我预期的那样包含所有子类/模块。

所以问题是 - 为了能够编写我通常能够在迁移中编写的相同代码,我该怎么办?

2 个答案:

答案 0 :(得分:2)

您可以尝试直接使用ActiveRecord::Migration

>> f = ActiveRecord::Migration.new
>> f.connection.methods.grep(/^create/)
=> [:create_savepoint, :create, :create_database, :create_schema, :create_table, :create_join_table]
=> f.connection.methods.grep(/^add_index/)
=> [:add_index, :add_index_sort_order, :add_index_options]
=> f.connection.create_table(:awesome_table, force: true) do |t|
=>   t.string :foo  
=> end  
#> (44.0ms)  CREATE TABLE "awesome_table" ("id" serial primary key, "foo" character varying(255))
=> {}

答案 1 :(得分:2)

迁移中的方法都是ActiveRecord::Migration类的类方法。所以你可以称之为

ActiveRecord::Migration.add_index :foo, :bar