Rails引擎中的迁移?

我有多个rails应用程序与同一个后端对话,我希望他们分享一些迁移。
我安装了一个rails引擎(与enginex),我可以共享任何东西(控制器,视图,模型,…),但没有迁移。 我不能使它工作!

我试图创build一个文件db / migrate / my_migration.rb,但在我的主应用程序,如果我这样做:

rake db:migrate 

它不加载它们。

谷歌search后,似乎有一些最近的工作 ,这似乎已经合并到铁路大师。 我与轨3.0.3你有没有看到任何方式使这项工作?

谢谢 !

我所做的是添加一个InstallGenerator ,将迁移添加到Rails网站本身。 它跟你提到的行为不一样,但是现在对我来说已经足够了。

一个小的方法:

首先,创build文件夹lib\generators\<your-gem-name>\install并在该文件夹内使用以下代码创build一个名为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

希望这可以帮助。

在rails 3.1中,你可以使用这个命令来做到这一点,给你的引擎名称是example

 # Note that you append _engine to the name rake example_engine:install:migrations 

在3.1之下,你可以通过改变config / application.rb来做这样的事情,而无需安装它们来共享迁移:

 # Our migrations live exclusively w/in the Commons project config.paths['db/migrate'] = Commons::Engine.paths['db/migrate'].existent 

从Rails 3.1看来,解决scheme是:

 bundle exec rake railties:install:migrations 

如果你只想复制一个特定的railtie,那么:

 bundle exec rake railties:install:migrations FROM=foo_engine 

请注意,名称是您所命名的gem和_engine。 所以如果gem是“富”,那么名字是foo_engine。

对于导轨4使用:

  initializer :append_migrations do |app| unless app.root.to_s.match root.to_s config.paths["db/migrate"].expanded.each do |expanded_path| app.config.paths["db/migrate"] << expanded_path end end end 

http://pivotallabs.com/leave-your-migrations-in-your-rails-engines/

为了解决Levi的问题,你也可以在引擎文件中做这样的事情,而不是应用程序。

所以在lib / commons / engine.rb

 module Commons class Engine < Rails::Engine initializer "commons.load_app_instance_data" do |app| Commons.setup do |config| config.app_root = app.root end app.class.configure do #Pull in all the migrations from Commons to the application config.paths['db/migrate'] += Commons::Engine.paths['db/migrate'].existent end end initializer "commons.load_static_assets" do |app| app.middleware.use ::ActionDispatch::Static, "#{root}/public" end end end 

编辑:小心,虽然这样做后,不要搞砸人的迁移历史,确保你添加一个新的迁移,如果需要改变,否则你可能会强迫某人做一些丑陋的回滚。