我所做的是添加一个InstallGenerator
将迁移添加到 Rails 站点本身的。它的行为与您提到的行为不完全相同,但就目前而言,对我而言,它已经足够好了。
一个小方法:
首先,创建文件夹lib\generators\<your-gem-name>\install
并在该文件夹内创建一个文件install_generator.rb
,使用以下代码调用:
require 'rails/generators/migration'
module YourGemName
module Generators
class InstallGenerator < ::Rails::Generators::Base
include Rails::Generators::Migration
source_root File.expand_path('../templates', __FILE__)
desc "add the migrations"
def self.next_migration_number(path)
unless @prev_migration_nr
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
else
@prev_migration_nr += 1
end
@prev_migration_nr.to_s
end
def copy_migrations
migration_template "create_something.rb", "db/migrate/create_something.rb"
migration_template "create_something_else.rb", "db/migrate/create_something_else.rb"
end
end
end
end
并在其中lib/generators/<your-gem-name>/install/templates
添加包含迁移的两个文件,例如取一个名为create_something.rb
:
class CreateAbilities < ActiveRecord::Migration
def self.up
create_table :abilities do |t|
t.string :name
t.string :description
t.boolean :needs_extent
t.timestamps
end
end
def self.down
drop_table :abilities
end
end
然后,当您的 gem 添加到某个应用程序时,您可以这样做
rails g <your_gem_name>:install
这将添加迁移,然后你就可以做rake db:migrate
.
希望这可以帮助。