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.
Para uso de rieles 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