Voglio creare un sacco di metodi per una funzione find_by. Non voglio scrivere la stessa cosa più e più volte, quindi voglio usare metaprogramming.define_method: Come creare dinamicamente metodi con argomenti
Dire che voglio creare un metodo per trovare per nome, accettando il nome come argomento. Come lo farei? Ho usato define_method in passato ma non avevo argomenti per il metodo da eseguire. Ecco la mia (cattivo) approccio
["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
Qualche idea? Grazie in anticipo.
Tenere presente che se tutto è un set di dati di grandi dimensioni, ciò potrebbe causare problemi di prestazioni. Inoltre spero sinceramente che questo sia al di fuori del contesto delle rotaie dato che rails implementa già 'find_by_XXX' per ogni attributo. – engineersmnky
Nota: questo definirà due metodi denominati 'self.find_by_name' e' self.find_by_brand'. Sebbene sia possibile creare tali metodi, è impossibile chiamarli usando la sintassi di chiamata del metodo normale, poiché '.' non è un carattere legale in un identificatore. C'è qualche ragione particolare per cui vuoi definire un metodo con un nome illegale? –
@engineersmnky Non è rotaie! tutto restituisce semplicemente una serie di 'Prodotti' per il sistema di inventario di un negozio di giocattoli. È per il progetto finale per il Ruby Nanodegree di Udacity. –