Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

296
Views
class << self en ruby y sus métodos

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 end

Por favor ayuda. Gracias

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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 end

y llamarlo en lugar de

 Model.update_impact(pr, count, user_id)

Me gusta esto

 pr.update_count(:impact, count, user_id)
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!