Ich möchte eine Reihe von Methoden für eine find_by-Funktion erstellen. Ich möchte nicht immer wieder dasselbe schreiben, also möchte ich Metaprogrammierung verwenden.define_method: So erstellen Sie Methoden dynamisch mit Argumenten
Angenommen, ich möchte eine Methode zum Suchen nach Namen erstellen und den Namen als Argument akzeptieren. Wie würde ich es tun? Ich habe in der Vergangenheit define_method verwendet, aber ich hatte keine Argumente für die Methode. Hier ist mein (sehr schlecht) Ansatz
["name", "brand"].each do |attribute|
define_method("self.find_by_#{attribute}") do |attr_|
all.each do |prod|
return prod if prod.attr_ == attr_
end
end
end
Irgendwelche Gedanken? Danke im Voraus.
Beachten Sie, wenn alles ein großer Datensatz ist, kann dies zu Leistungsproblemen führen. Ich hoffe auch, dass dies außerhalb des Rails-Kontexts liegt, da rails bereits 'find_by_XXX' für jedes Attribut implementiert. – engineersmnky
Hinweis: Dies definiert zwei Methoden namens 'self.find_by_name' und' self.find_by_brand'. Obwohl es möglich ist, solche Methoden zu erstellen, ist es unmöglich, sie mit der normalen Methodenaufrufsyntax aufzurufen, da '.' kein gültiges Zeichen in einem Bezeichner ist. Gibt es einen bestimmten Grund, warum Sie eine Methode mit einem ungültigen Namen definieren möchten? –
@engineersmnky Es ist nicht Schienen! Alle geben nur ein Array von 'Produkten' für das Inventarsystem eines Spielzeugladens zurück. Es ist das letzte Projekt für den Ruby Nanodegree in Udacity. –