Rails引擎,调用容器应用程序的本机迁移生成器

dfa*_*ken 6 migration ruby-on-rails generator

SO上的其他人已经询问(并已经回答)如何编写迁移模板,该模板将像任何其他模板一样被复制到容器应用程序中.我们正在编写一个需要在Rails的多个主要版本中工作的Rails引擎,所以我们希望找到一种方法来使用应用程序的本机迁移生成器来生成迁移,而不是必须维护多个模板,或者需要编写一个可以处理多个主要版本的复杂模板.

我在Rails引擎文档(9.12)中看到你可以像这样调用其他生成器:

generate "scaffold", "forums title:string description:text"
Run Code Online (Sandbox Code Playgroud)

其中生成器的名称及其参数是单个字符串.但是,以下内容对我们不起作用:

generate 'migration', 'create_table_name column1:type ...'
Run Code Online (Sandbox Code Playgroud)

对我们来说,无论Rails版本如何,都会使用正确的名称创建迁移文件,但是使用空updown(或change)方法.因此,好像只有第一个参数实际上是由本机迁移生成器接收的.

实际上有办法做到这一点吗?

tru*_*iso 3

通过使用驼峰式大小写生成语法,这对我来说效果很好:

lib/generators/test_generator.rb

class TestGenerator < Rails::Generators::Base                                  
  def build_table                                                              
    generate 'migration', 'CreateFoo name:string'                              
  end                                                                          
end
Run Code Online (Sandbox Code Playgroud)

rails g test创建了迁移:

db/migrate/20170128040004_create_foo.rb

class CreateFoo < ActiveRecord::Migration[5.0]                                    
  def change                                                                      
    create_table :foos do |t|                                                     
      t.string :name                                                              
    end                                                                           
  end                                                                             
end  
Run Code Online (Sandbox Code Playgroud)

所以我认为你只需要使用语法CreateTableName而不是create_table_name.