2

Ich schreibe SaaS-Modell-Anwendung. Meine Anwendungsdatenbank besteht aus zwei logischen Teilen:Wie erstellt man die Migration im Unterverzeichnis mit Rails?

  • Anwendungstabellen - wie Benutzer, Rollen ...
  • benutzerdefinierte Tabellen (er sich von ui Ebene erzeugen kann), die für jede Anwendungsinstanz unterschiedlich sein kann

Alle Tabellen werden durch Schienen Migrationsmechanismus erstellt.

würde Ich mag benutzerdefinierte Tabellen in ein anderes Verzeichnis setzen:

  • db/Migrationen - Anwendungstabellen
  • db/Migrationen/custom - Tabellen, die durch Benutzer

so kann ich Do svn: Ignoriere auf db/migrations/custom, und wenn ich Aktualisierungen meiner App auf Client-Servern mache, würde dies nur die Migration von Anwendungstabellen aktualisieren.

Gibt es eine Möglichkeit, dies in Schienen zu erreichen?

+0

ich https://github.com/thuss/standalone-migrations bin mit hinzuzufügen, diese zu lösen Herausforderung. – eebbesen

Antwort

2

@Vasily danke für Ihre Antwort. Nachdem ich es gelesen habe und weitere Fragen von stackoverflow gestellt habe, kam ich auf die folgende Lösung:

Da ich meinen eigenen Generator schreibe, um Benutzertabellen zu erstellen, habe ich Rails :: Generators :: Migration darin eingefügt, damit ich next_migration_number Methode wie folgt überschreiben kann:

def self.next_migration_number(dirname) 
if ActiveRecord::Base.timestamped_migrations 
    Time.now.utc.strftime("custom/%Y%m%d%H%M%S") 
else 
    "custom/%.3d" % (current_migration_number(dirname) + 1) 
end 
end 

Nun werden alle vom Benutzer erzeugte Migrationen werden in db/Migrationen/custom-Verzeichnis erstellt.

class ExecuteCustomMigrations < ActiveRecord::Migration 
    MIGRATIONS_PATH='db/migrate/custom' 
    def self.up 
    Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"]. 
    sort.map{|filename|require filename}.flatten. 
    each{|class_name| const_get(class_name).up} 
    end 

    def self.down 
    Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"].sort.reverse. 
    map{|filename|require filename}.flatten. 
    each{|class_name| const_get(class_name).down} 
    end 
end 

Nach Benutzer erstellt benutzerdefinierte Tabelle Ich nenne diese Migration mit diesem Code:

Rake::Task["db:migrate:redo"].execute("VERSION=20110108213453") 
5

Aufgabe rake db:migrate hat einen fest codierten Pfad zu Migrationen. Sie können jedoch Ihre eigene Rake-Aufgabe erstellen. Erstellen Sie zum Beispiel lib/tasks/custom_db_migrate.rake mit folgendem Inhalt:

namespace :db do 
    task :custom_migrate => :environment do 
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true 
    ActiveRecord::Migrator.migrate("db/migrate/custom", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby 
    end 
end 

Jetzt können Sie rake db:custom_migrate laufen Migrationen zu laufen, die in db/migrate/custom befinden. Es werden jedoch keine Migrationen vom Standardpfad verwendet.

Möglicherweise möchten Sie read the source code für die ActiveRecord-Migrationen.

2

Wenn

Dann normalen Schienen Migration, die alle Migrationen von db/Migrationen/custom Verzeichnis ausführt Ich schrieb Wenn Sie Sinatra verwenden und eine eigene Rake-Aufgabe erstellen, können Sie Folgendes tun:

Wenn Sie rake -T ausführen, werden Sie den db-Namespace erhalten:

rake db:create_migration # create an ActiveRecord migration 
rake db:migrate   # migrate the database (use version with VERSION=n) 
rake db:rollback   # roll back the migration (use steps with STEP=n) 
0

mit 4 Schienen wir, dass die Migration Verzeichnisse werden in einer Reihe von „db/Migration“

-Code snipit von Active zugegriffen gespeichert sehen /lib/active_record/migration.rb

def migrations_paths 
    @migrations_paths ||= ["db/migrate"] 
    # just to not break things if someone uses: migrations_path = some_string 
    Array(@migrations_paths) # Data stored in an array 
end 

so können wir auf dieses Array mit config in environment.rb als Beispiel

hinzufügen

Auch konnte ich das nicht dokumentiert finden, aber zusätzliche Verzeichnisse unter db/migrate werden auch gesucht und ausgeführt.

z.B. Ich habe Gruppen von Migrationen in Release Verzeichnisse

-db/migrate 
    -3.0.0 
     XXXXXcreate_user.rb 
    -3.0.1 
     XXXXXcreate_task.rb 

Dieser Mechanismus auch Verzeichnisse Motor Migration verwendet wird Discussed here

Verwandte Themen