2011-05-30 12 views
6

Me doy cuenta de que esta no es necesariamente la forma más inteligente de hacerlo, pero ahora mi curiosidad está activa y tengo curiosidad cómo para hacerlo.Métodos dinámicos en un modelo de rieles

Tengo un modelo en el proyecto Rails. Lo llamaremos Deal. Por ActiveRecord y todas esas cosas interesantes hay columnas definidas en la base de datos como UPDATED_AT y se convierten en métodos en Deal: deal.updated_at => '04/19/1966 3:15 am '

Digamos que quería tener métodos que me dijo el día de la semana en lugar de todo el asunto de la fecha y el tiempo. Sé que existen métodos de la clase DateTime de modo que pueda hacer

deal.updated_at.day_of_week => 'Monday' (*) 

pero lo que si sólo quería

deal.updated_day => 'Monday' 

Puedo escribir en deal.rb

def update_day 
    self.updated_at.day_of_week 
    end 

Entendido.

Pero lo que si quería que SIEMPRE he el método disponible para CUALQUIER columna de fecha que se ha añadido al modelo?

Vi definir_metodo por ahí (algunos aquí en StackOverflow). Entonces entiendo eso. Pero me gustaría llamarlo justo después de ActiveRecord hizo su magia, ¿verdad? Por lo tanto, si mi modelo de Deal tuviera updated_at, created_at, offered_at y lawsuit_at, me gustaría que coincidan los métodos para cada uno. Más importante aún, si vino otro desarrollador y agregué una columna llamada scammed_at, me gustaría crear scammed_day junto con el método scammed_at.

¿Cómo podría hacer eso?

Gracias.

(*) Uh, o algo así, siempre miro esa llamada.

Respuesta

8

Supongo que algo como lo siguiente debería ser el truco. En su modelo:

# looping through all model's columns 
self.columns.each do |column| 
    #if column's name ends with "_at" 
    if column.name =~ /_at$/ 
    #create method like "udpated_day" 
    define_method "#{column.name[0..-4]}_day" do 
     self.send(column.name).day_of_week 
    end 
    end 
end 

sino que implica cada columna tiene un método válido day_of_week ...

bien usted consigue la idea que pienso. No dude en solicitar los detalles

+1

Debería ajustar la llamada 'define_method' en un condicional' if column.name = ~/_at $/'. –

+0

Definitivamente tiene razón, corrección añadida, gracias – apneadiving

+0

Entonces, si solo agrego eso en el archivo de modelo, supongo que después de mis otras declaraciones de def de método, se cargará después de que la base de datos defina las columnas. Eso es exactamente lo que quiero. –

Cuestiones relacionadas