Domanda

Non ho più applicazioni rotaie che parlano allo stesso backend e mi piacerebbe che condividono alcune migrazioni.
ha installato un rotaie motore (con enginex), posso condividere nulla (controllori, viste, modelli, ...), ma non le migrazioni. Non riesco a farlo funzionare!

Ho cercato di creare un file db / migrate / my_migration.rb ma nella mia applicazione principale, se lo faccio:

  rake db:migrate

E non li carica.

Dopo un po 'googling sembra che ci fosse qualche recente lavoro su questo e sembra questo ha stato fondono per rotaie padrone. Sono con rotaie 3.0.3 vedete un modo per fare questo lavoro?

Grazie!

È stato utile?

Soluzione

Quello che faccio, è aggiungere un InstallGenerator che aggiungerà le migrazioni al sito Rails stesso. Ha non proprio lo stesso comportamento di quello che lei ha citato, ma per il momento, per me, è abbastanza buono.

Un piccolo how-to:

In primo luogo, creare la lib\generators\<your-gem-name>\install cartella e all'interno di tale cartella creare un file chiamato install_generator.rb con il seguente codice:

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

e dentro la lib/generators/<your-gem-name>/install/templates aggiungere i due file contenente le migrazioni, per esempio prendere quella denominata 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

Poi, quando il gioiello è aggiunto qualche app, si può solo fare

rails g <your_gem_name>:install

e che aggiungerà le migrazioni, e poi si può solo fare rake db:migrate.

Spero che questo aiuti.

Altri suggerimenti

in Rails 3.1, lo si può fare con questo comando, dare che il nome del motore è example:

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

Sotto 3.1, è possibile condividere le migrazioni, senza installarli, alterando config / application.rb di fare qualcosa di simile a questo:

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

Come di Rails 3.1 si presenta come la soluzione è:

bundle exec rake railties:install:migrations

Se si desidera solo copiare da una specifica railtie poi:

bundle exec rake railties:install:migrations FROM=foo_engine

Si noti che il nome è tutto ciò che si chiama gemma più _engine. Quindi, se il gioiello è "foo", allora il nome è foo_engine.

Per rotaie 4 uso:

   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

https://content.pivotal.io / blog / congedo-your-migrazioni-in-your-rails-motori

Per andare al largo della risposta di Levi si potrebbe anche fare qualcosa di simile nel file motore nella realtà del motore, invece dell'applicazione.

Quindi, in lib / comuni / 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

Modifica:. Attenzione però a non rovinare la storia della migrazione persone dopo aver fatto questo, assicuratevi di aggiungere una nuova migrazione, se è necessario un cambiamento, altrimenti si potrebbe costringere qualcuno a fare un po 'rollback brutte

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top