es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Clase << self en Ruby y sus métodos.

Tengo un modelo en Ruby on Rails con el código que se muestra a continuación, el cual utiliza una definición de clase singleton. Además, tiene cierta lógica de metaprogramación. Sin embargo, no entiendo cuándo se invocará este código. ¿Sucederá cuando se esté editando un atributo especificado a continuación?

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
end

Por favor, ayuda.
Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Este código define una clase singleton en el modelo de Producto en Ruby on Rails. Dentro de esa clase singleton, se definen varios métodos utilizando metaprogramación. Cada método se llama “update_{nombre_del_atributo}” y toma tres parámetros: la instancia del producto a actualizar, el nuevo valor para el atributo especificado y el ID del usuario que realiza la actualización.

    Los atributos que se están actualizando son ‘cat_no’, ‘effort’, ‘impact’, ‘effect’ y ‘feedback’. El código de cada método establece los atributos de orden y de idea del producto, y luego actualiza el atributo especificado con el nuevo valor y el atributo last_modified_by con el ID del usuario.

    Para invocar uno de estos métodos de actualización, tendrías que llamarlo explícitamente en tu código, pasando la instancia del producto adecuada, el valor del atributo y el ID del usuario. Por ejemplo, para actualizar el atributo ‘effort’ de una instancia del producto ‘p’ a un valor de 10 y el atributo last_modified_by a un ID de usuario de 123, deberías llamar a Product.update_effort(p, 10, 123).

Comments are closed.