Require und Rails

Rails‘ Autoloading macht einen guten Job, so dass man Abhängigkeiten selten per Hand auflösen muss. Will man aber etwa eine bestehende Modelklasse aus einer Engine öffnen um eigenen Code zu ergänzen, so muss das Original notwendigerweise vorhanden sein:

# userengine/app/models/user

class User < ActiveRecord::Base
  belongs_to :user_group
end
# railsapp/app/models/user

require User::Engine.root.join('app', 'models', 'user')

class User < ActiveRecord::Base
  belongs_to :user_group
end

Dies wird vor allem während der Entwicklung zu Problemen führen, da Rails bei einer Änderung die Klasse zurücksetzt und nur die geänderte Datei neu lädt. Die andere Klassendefinition geht verloren, was zu merkwürdigen Ergebnissen führen kann.

Die Lösung für Rails ist ein spezielles Require, welches sich mit Autoloading verträgt:

# railsapp/app/models/user

require_dependency User::Engine.root.join('app', 'models', 'user')
# ...

Im Rails-Guide wird Single-Table-Inheritance als weiteres Einsatzgebiet genannt.