Dipl.-Ing. Peter Ehrenberg [dipe]

Web- und Datenbankanwendungen

Implementiere ich eine Methode, die als Argument ein Modell-Objekte emfangen soll, frage ich mich oft "Benötige ich hier tatsächlich das Exemplar des Objekts, oder genügt auch dessen ID?".

Stellen Sie sich eine Methode append vor, die einen gegeben Song an eine Playlist anhängen soll:

class Playlist

  has_many :entries

   # Creates and returns a new playlist entry for given song
  def append(song)
    enties.create(:song_id => song.id)
  end

end

Für den Benutzer dieser Methode bedeutet das, dass er das Song-Objekt zuvor laden muss. Die append Methode benötigt aber letztlich nur dessen ID. Für eine Web-Anwendung kann das sehr teuer sein, da die Requests nur IDs liefern und die Objekte jedes mal neu aus der Datenbank geladen werden müssen.

Die Signatur der Methode dahingehend zu ändern, dass sie grundsätzlich eine ID empfängt, geht oft nicht durchgängig und ist deshalb nicht schön. Es kann also eine gute Idee sein, solche Methoden so zu implementieren, dass sie sowohl Objekt-Exemplare als auch IDs empfangen können.

Nur wie kann ich das implementieren, ohne durch eine zusätzliche Fallunterscheidung deren Komplexität zu erhöhen? Eine Lösung ist, für Songs die Methode to_s zu implementieren:

class Song
  ...

  # Returns the record id
  def to_i
    id
  end

end

Nun kann ich die Eingangs erwähnte Methode so formulieren:

 # Creates and returns a new playlist entry for given song or song-id
def append(song_or_id)
  enties.create(:song_id => song_or_id.to_i)
end

Auf den Parameter song_or_id wird die Methode to_i angewendet. Sie liefert für einen gegebenen Song dessen Id und für eine gegebene ID deren Wert .

Powered by Mephisto - Valid: xhtml | css
Stoppt die Vorratsdatenspeicherung! Jetzt klicken &handeln! Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien: