Dienstag, 12. April 2011

ActiveRecord Migrations in Rails 3.0 Engines

Im aktuellen Rails 3.0 fehlen aus meiner Sicht noch einige recht wichtige Features der Rails-Engines:
  • Datenbank-Migrationen aus Eninges
  • Tasks zum Kopieren oder Verlinken von Assets (/public Verzeichnis in der Engine)
  • Die Möglichkeit eine Engine in den Routen der Applikation zu "mounten" 
All diese Punkte werden zwar mit dem Rails 3.1 Release voraussichtlich behoben sein, aber gerade die ersten beiden Punkte sind auch unter Rails 3.0 relativ einfach selbst zu adressieren. So genügt zum Einbetten und Bereitstellen eigener ActiveRecord-Migrationen ein einfacher rake-task (kopiert aus dem Rails core und leicht modifiziert):
    task :migrate => :environment do
      ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
      ActiveRecord::Migrator.migrate(MeinEngineNamespace::Engine.find_root_with_flag("db").join('db/migrate'), ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
      Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
    end
Der einzige Unterschied zu dem original-task im Rails core ist das MeinEngineNamespace::Engine.find_root_with_flag("db"). Dort steht im "original" ein einfaches Rails.root.
Ist der obige Task irgendwo in der Engine eingebaut (möglichst auch in einem aussagekräftigen Namespace), so können damit aus einer Applikation alle Migrations-Scripte im db/migration Verzeichnis der Engine "rauf" und auch wieder "runter" migriert werden (analog zum "gewohnten" db:migrate Task).

Keine Kommentare:

Kommentar veröffentlichen