Ruby on rails 如何使用ActiveRecord';Rake任务中的DSL迁移?

Ruby on rails 如何使用ActiveRecord';Rake任务中的DSL迁移?,ruby-on-rails,activerecord,rake,database-migration,Ruby On Rails,Activerecord,Rake,Database Migration,我需要执行一些数据库操作,例如创建表、添加索引等。我希望使用迁移中使用的相同方法,例如创建表,添加索引等。但是,当我尝试此操作时,我得到了 NoMethodError: undefined method `add_index' for main:Object 我在文件开头添加了以下内容: include ActiveRecord::ConnectionAdapters::SchemaStatements 但是,现在我得到了以下错误: NameError: undefined local va

我需要执行一些数据库操作,例如创建表、添加索引等。我希望使用迁移中使用的相同方法,例如
创建表
添加索引
等。但是,当我尝试此操作时,我得到了

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
,但它并没有像我预期的那样包括所有的子类/模块


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

您可以尝试直接使用
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))
=> {}

您可以尝试直接使用
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))
=> {}

迁移中的方法都是
ActiveRecord::migration
类的类方法。所以你可以这样称呼他们

ActiveRecord::Migration.add_index :foo, :bar

迁移中的方法都是
ActiveRecord::migration
类的类方法。所以你可以这样称呼他们

ActiveRecord::Migration.add_index :foo, :bar

顺便问一下,你为什么这么做?大多数“可重用迁移”以rake任务的形式存在,这些任务将gem的迁移安装到要在公共迁移工作流中运行的项目中。您的方法似乎一开始就不符合迁移的目的。@D-side我需要在数据库中创建一些自定义表,为它们添加索引,通过存储过程填充它们等等。此外,我需要定期而不是一次重新创建它们。啊,这就是运行时的需要。那好吧,顺便问一下,你为什么这么做?大多数“可重用迁移”以rake任务的形式存在,这些任务将gem的迁移安装到要在公共迁移工作流中运行的项目中。您的方法似乎一开始就不符合迁移的目的。@D-side我需要在数据库中创建一些自定义表,为它们添加索引,通过存储过程填充它们等等。此外,我需要定期而不是一次重新创建它们。啊,这就是运行时的需要。好吧。我真的需要连接吗?似乎
ActiveRecord::Migration.new
也有我需要的方法。
connection
,只需返回当前的数据库连接
ActiveRecord::Base.connection
您可以在运行时为另一个数据库覆盖它。我喜欢使用清晰的代码。我真的需要连接吗?似乎
ActiveRecord::Migration.new
也有我需要的方法。
connection
,只需返回当前的数据库连接
ActiveRecord::Base.connection
您可以在运行时为另一个数据库覆盖它。我更喜欢使用清晰的代码。