37 votes

Les Migrations dans des Rails de Moteur?

J'ai plusieurs applications rails de parler de la même backend et je tiens à partager certaines migrations.
J'ai installé un moteur rails (avec enginex), je peux partager quelque chose (contrôleurs, les vues, modèles,...) mais pas de migrations. Je ne peux pas le faire fonctionner !

J'ai essayé de créer un fichier db/migrate/my_migration.rb mais dans mon application principale si je fais :

  rake db:migrate

Il n'a pas les charger.

Après quelques recherches sur google, il semble qu'il y avait quelques travaux récents sur ce sujet et il semble que cela a été fusionnés à des rails de maître. Je suis avec rails 3.0.3 voyez-vous une façon de faire ce travail ?

Merci !

39voto

Jais Points 361

Dans les rails 3.1, vous pouvez le faire en utilisant cette commande, donnez votre nom moteur est example:

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

33voto

nathanvda Points 25878

Ce que je fais, c'est d'ajouter un InstallGenerator qui va ajouter les migrations vers les Rails site lui-même. Il n'a pas tout à fait le même comportement que celui que vous avez mentionné, mais pour l'instant, pour moi, c'est bien assez.

Un petit how-to:

Tout d'abord, créez le dossier lib\generators\<your-gem-name>\install et à l'intérieur de ce dossier, créez un fichier appelé install_generator.rb avec le code suivant:

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

et à l'intérieur de l' lib/generators/<your-gem-name>/install/templates ajouter vos deux fichiers contenant les migrations, par exemple, prendre le nom de 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

Puis, lorsque votre bijou est ajouté à certaines app, vous pouvez le faire

rails g <your_gem_name>:install

et qui va ajouter les migrations, et alors vous pouvez simplement faire rake db:migrate.

Espérons que cette aide.

23voto

Levi Points 2212

Sous 3.1, vous pouvez partager des migrations, sans les installer, en modifiant le fichier config/application.rb pour faire quelque chose comme ceci:

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

21voto

Eric Anderson Points 680

Comme de Rails 3.1 ressemble la solution est:

bundle exec rake railties:install:migrations

Si vous ne souhaitez copier à partir d'un certain railtie alors:

bundle exec rake railties:install:migrations FROM=foo_engine

À noter que le nom est tout ce que vous gem est nommé plus _engine. Donc, si la gemme est "toto", puis le nom est foo_engine.

17voto

montrealmike Points 3795

Pour les rails 4 utilisation:

   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/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X