with tutorial framework espaƱol djangoproject desde con cero applications ruby-on-rails ruby-on-rails-3 rails-engines

ruby-on-rails - framework - tutorial django



Migraciones en Rails Engine? (6)

A partir de Rails 3.1, parece que la solución es:

bundle exec rake railties:install:migrations

Si solo quieres copiar desde una razón específica, entonces:

bundle exec rake railties:install:migrations FROM=foo_engine

Tenga en cuenta que el nombre es lo que sea que su gema se llame más _engine. Entonces, si la gema es "foo", entonces el nombre es foo_engine.

Tengo varias aplicaciones de rieles que hablan con el mismo backend y me gustaría que compartan algunas migraciones.
Configuré un motor de rieles (con motorx), puedo compartir cualquier cosa (controladores, vistas, modelos, ...) pero no migraciones. No puedo hacer que funcione!

Intenté crear un archivo db / migrate / my_migration.rb pero en mi aplicación principal si lo hago:

rake db:migrate

No los carga.

Después de buscar en Google, parece que hubo algún trabajo reciente sobre esto y parece que this se ha fusionado con el maestro de rieles. Estoy con Rails 3.0.3 ¿ves alguna forma de que esto funcione?

Gracias !


En 3.1, puede compartir migraciones, sin instalarlas, alterando config / application.rb para hacer algo como esto:

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


En rails 3.1, puede hacerlo usando este comando, indique que su nombre de motor es un example :

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


Lo que hago es agregar un InstallGenerator que agregará las migraciones al sitio de Rails. No tiene el mismo comportamiento que el que mencionaste, pero por ahora, para mí, es lo suficientemente bueno.

Un pequeño tutorial:

Primero, cree la carpeta lib/generators/<your-gem-name>/install y dentro de esa carpeta cree un archivo llamado install_generator.rb con el siguiente código:

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

y dentro de lib/generators/<your-gem-name>/install/templates agrega tus dos archivos que contienen las migraciones, p. ej. toma uno llamado 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

Luego, cuando su gema se agrega a alguna aplicación, puede hacer

rails g <your_gem_name>:install

y eso agregará las migraciones, y luego puedes hacer rake db:migrate .

Espero que esto ayude.


Para salir de la respuesta de Levi, también podría hacer algo como esto en su archivo de motor en el motor en realidad, en lugar de la aplicación.

Entonces en 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

Editar: tenga cuidado de no estropear el historial de migración de las personas después de hacer esto, asegúrese de agregar una nueva migración si se necesita un cambio, de lo contrario, podría obligar a alguien a hacer algunas reversiones feas.