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