2010-11-20 5 views
4

Also hier ist das Problem, da die Find_by Methoden in AR die Methode fehlt Methode, können Sie nicht wirklich Alias ​​sie mit alias_method (weil die Methode nicht existiert!). Oder so scheint es.Aliasing find_by Methoden in Schienen ActiveRecord

Weiß jemand, wie man das macht?

etwas ausführlicher zu liefern, was ich versuche, dies zu tun ist ..

ich ein AR-Modell, Benutzer, aber es ergänzt einige davon Attribute von einer sekundären Datenquelle ist - dies sollte das Standardverhalten Um dies zu erreichen, benutzte ich den after_find-Callback und fügte zu diesem Zeitpunkt meine neuen Attribute aus der zweiten Datenquelle hinzu.

Das Problem ist, dass ich in der Lage sein, gelegentlich die Find_by-Methoden ohne Erweiterung von der zweiten Datenquelle verwenden können.

Mein Gedanke ist jetzt, Alias ​​zu verwenden, um zwei Varianten der Methoden find_by zu erstellen: find_by und find_without_by.

Das Ideal wäre, wenn Schienen einige magische Sauce hatte, die Sie Platzhalter in alias_method verwenden lassen, was zu:

alias_method: find_without *: * finden

irgendwelche Vorschläge? Ich kann bei Bedarf bestimmte Punkte klären.

Vielen Dank im Voraus!

+0

Ich glaube, Sie dies mit Scopes erreichen können. Bist du auf Schienen 2 oder 3? –

+0

2.3.5, können Sie ein bisschen mehr Details zur Verfügung stellen? Ich habe die Schlüsselwörter für den Bereich noch nicht verwendet. – CambridgeMike

Antwort

3

Sie könnten method_missing in Ihre eigenen Modelle definieren und dann in die reguläre Methode abgehen fehlt, wenn es ein find_without_abc Anruf:

MyModel < ActiveRecord::Base 
    def method_missing(method, *args) 
    return super(method, args) if method =~ /find_without/ 

    # Your custom find code is here... 
    end 
end 
+0

Das ist eine gute Idee ... der einzige Push-Back dabei ist, dass ich gehofft hatte, mein "Augment mit Daten aus einer zweiten Datenbank" in ein Modul zu trennen, damit ich es wiederverwenden konnte. Vielleicht ist das ein bisschen wie ein Traum. – CambridgeMike

+0

Oh, das Problem ist, dass "Super" von einem inbegriffenen Modul zu nennen, schien nicht zu tun, was ich erwartet hatte, nämlich ich habe einen Fehler "Finden nicht definiert" – CambridgeMike

+1

Wie sieht Ihr Modul aus und wie werden Sie es aufnehmen? –

Verwandte Themen