У меня есть несколько приложений rails, которые обращаются к одному и тому же бэкэнду, и я бы хотел, чтобы они поделились некоторыми миграциями. Я устанавливаю движок rails (с enginex), я могу делиться чем угодно (контроллерами, представлениями, моделями, ...), но никаких миграций. Я не могу заставить это работать!
Я попытался создать файл db / migrate / my_migration.rb, но в моем основном приложении, если я это сделаю:
rake db:migrate
Это их не загружает.
После некоторого поиска в Google выяснилось, что было несколько недавних работать над этим, и кажется, что это было объединено с рельсы мастер. Я использую rails 3.0.3, вы видите, как заставить эту работу работать?
Спасибо !
Вот довольно хорошая запись в блоге о движках до 3.1 на тот случай, если вы не можете использовать новейшие игрушки. stubbleblog.com/index.php/2011 / 04 / jacklin 17.11.2012
Что я делаю, так это добавляю 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
Затем, когда ваш драгоценный камень добавлен в какое-либо приложение, вы можете просто сделать
rails g <your_gem_name>:install
и это добавит миграции, и тогда вы можете просто сделать rake db:migrate.
Надеюсь это поможет.
Ответ 2 · рейтинг 43 · Jais
В rails 3.1 вы можете сделать это с помощью этой команды, указав имя вашего движка example:
# Note that you append _engine to the name
rake example_engine:install:migrations
Ответ 3 · рейтинг 23 · Levi
В версии 3.1 вы можете делиться миграциями, не устанавливая их, изменив config / application.rb, чтобы сделать что-то вроде этого:
# Our migrations live exclusively w/in the Commons project
config.paths['db/migrate'] = Commons::Engine.paths['db/migrate'].existent
Ответ 4 · рейтинг 21 · Eric Anderson
В Rails 3.1 решение выглядит следующим образом:
bundle exec rake railties:install:migrations
Если вы хотите скопировать только с определенного рейса, тогда:
Обратите внимание, что имя - это то, что у вашего драгоценного камня, плюс _engine. Итак, если гем - "foo", то имя - foo_engine.
Ответ 5 · рейтинг 18 · montrealmike
Для рельсов 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
Чтобы уйти от ответа Леви, вы также можете сделать что-то подобное в файле вашего движка в собственном движке, а не в приложении.
Итак, в 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
Изменить: будьте осторожны, чтобы не испортить историю миграции людей после этого, убедитесь, что вы добавили новую миграцию, если требуется изменение, иначе вы можете заставить кого-то сделать некоторые уродливые откаты.