Set-Methoden (setter) eines Active Record-Objekts überschreiben (override)
ActiveRecord, der Objekt-relationale-Mapper, der im Web-Framework Ruby on Rails zum Einsatz kommt, ist ein flexibel und leicht zu bedienen.
Wie jede komplexe Bibliothek hat aber auch diese eine Reihe nicht intuitiver Aspekte. Ein solcher Aspekt ist die Methode, wie man die von ActiveRecord zur Laufzeit hinzugefügten get- und set-Methoden der Modelle (models) überschreiben kann.
Hier ein Code-Beispiel:
class Bill < ActiveRecord::Base belongs_to :customer #[...] def customer=(my_customer) write_attribute(:customer, my_customer) # [...] weiterführende Verarbeitung end end class Customer < ActiveRecord::Base has_many :bills end
Der Trick besteht im Wesentlichen aus zwei Kniffen.
Zum einen verhindern wir den Namenskonflikt durch die Verwendung des my_customer Parameters und zum Anderen verwenden wir write_attribute für das Setzen der customer-Variable. Letzteres verhindert eine endlose rekursion der customer=-Methode.