Tengo un modelo en ruby on rails con el siguiente código, que usa una definición de clase singelton. Además, algo de lógica de metaprogramación. Pero, no entiendo cuándo se invocará este código. ¿Es cuando se está editando un atributo a continuación especificado?
class Product < ApplicationRecord class << self ['cat_no', 'effort', 'impact', 'effect', 'feedback'].each do |attr| define_method "update_#{attr}" do |pr, count, user_id| pr.order=pr.cat_no pr.idea=pr.description pr.update("#{attr}"=>count,:last_modified_by=>user_id) end end end endPor favor ayuda. Gracias
Este código genera cinco métodos, uno para cada nombre de atributo en la lista. Todos estos métodos generados toman tres argumentos y básicamente se verán así (utilizo el nombre del atributo de impact como ejemplo):
def self.update_impact(pr, count, user_id) pr.order = pr.cat_no pr.idea = pr.description pr.update("impact" => count, :last_modified_by => user_id) end Eso significa que hay cinco métodos generados que actualizan el pasado en pr con algunos datos de sí mismo y con un count y un user_id de usuario.
Tenga en cuenta que este método solo trata con un pr específico, por lo tanto, es mejor usar una instancia en lugar de un método de clase como ya sugirió Stefan en su comentario. Y en mi opinión, no hay realmente un beneficio en la metaprogramación aquí. Cambiaría la lógica a
def update_count(type, count, user_id) # or any another name that makes sense in the domain if type.in?(%i[cat_no effort impact effect feedback]) update( :order => cat_no, :idea => description, :last_modified_by => user_id, type => count ) else raise ArgumentError, "unsupported type '#type'" end endy llamarlo en lugar de
Model.update_impact(pr, count, user_id)Me gusta esto
pr.update_count(:impact, count, user_id)