2012-04-02 2 views
2

Ich habe eine Legacy-DB, wo zwei ziemlich ähnliche Objekttypen in verschiedenen Tabellen mit unterschiedlichen Spalten und Beziehungen gespeichert sind. Es gibt eine Elternklasse, die für die Überbrückung der Lücke verwendet wird, aber ich habe ein wenig verloren, wie ich sie implementieren kann, um die untergeordneten Klassen zu emulieren. Idealerweise sollten Methoden wie find_all_by_* auf beiden Unterklassen ausgeführt werden und alle Ergebnisse in einem einzigen Array zurückgeben. Gibt es einen kanonischen Weg, um das zu tun, einfacher als das Kopieren the code of find?Rails: Wie find * für eine abstrakte Klasse implementieren?

+0

Wie wäre es mit dem Erstellen einer Sicht in der DB? – Yanhao

Antwort

0

Okay, interessante Frage. Ich bin mir nicht sicher, ob es eine bessere Lösung als diese gibt, aber ich würde ein wenig Methode verwenden, um Magie zu vermeiden.

class MyVirtualModel 

    def respond_to?(method, include_private = false) 
    if method.to_s =~ /^find.*/ 
     RealModel1.respond_to?(method, include_private) && RealModel2.respond_to?(method, include_private?) 
    else 
     false 
    end 
    end 

    def method_missing(method, *arguments, &block) 
    if method.to_s =~ /^find.*/ 
     resultset1 = RealModel1.send(method, arguments) 
     resultset2 = RealModel2.send(method, arguments) 
     return resultset1 + resultset2 
    end 
    end 

end 
+0

Ordentlich Lösung, aber es sieht so aus, als ob der ganze Block umgangen wird: 'PG :: Error: ERROR: relation" "existiert nicht'. 'binding.pry' in beiden Methoden hat nicht geholfen - Sie werden nicht vom Rails Webserver aufgerufen. – l0b0

Verwandte Themen