Error en read_attribute

Me he bajado este codigo de internet para que me devuelva la edad
segun la fecha de nacimiento

def self.age
years = Date.today.year - read_attribute(:birthdate).year
if Date.today.month < read_attribute(:birthdate).month ||
(Date.today.month == read_attribute(:birthdate).month &&
read_attribute(:birthdate).day >= Date.today.day)
years = years - 1
end
return years
end

Lo he puesto en el modelo pero al ejecutarlo desde la vista me da el
error

undefined method `read_attribute’ for User:Class

Lo curioso es que dentro de ese mismo modelo tengo este otro que si
funciona bien pero con write_attribute

def fill_data_create
write_attribute “password”, self.class.sha1(password)
end

¿A que puede ser debido?

Otra cosa, ¿existe algo en MySQL para calcular directamente la edad
desde un campo con la fecha de nacimiento?

On 9/6/07, Jose Francisco G. [email protected] wrote:

return years
write_attribute "password", self.class.sha1(password)

end

¿A que puede ser debido?

El método no debería ser de clase, si no de instancia, es decir,
deberías eliminar “self.” de la definición. Creo que con eso
funcionaría.

Otra cosa, ¿existe algo en MySQL para calcular directamente la edad
desde un campo con la fecha de nacimiento?

No lo se, pero las bases de datos están para almacenar datos, Ruby
sirve muy bien para calcular esos datos. Cada uno con su tarea.

El 6/09/07, Jose Francisco G. <josefgon@…>
escribió:> Otra cosa, ¿existe algo en MySQL para calcular directamente la edad

desde un campo con la fecha de nacimiento?

Prueba con algo estilo:

SELECT TO_DAYS(NOW()) - TO_DAYS(birthday) FROM users;

Un saludo,

Serabe

Ok, ya ha funcionado, muchas gracias a los dos.

On 9/6/07, Jose Francisco G. [email protected] wrote:

El método no debería ser de clase, si no de instancia, es decir,
deberías eliminar “self.” de la definición. Creo que con eso
funcionaría.

Si le quito self y la llamo desde la vista con <%= User.age %> me da
el error undefined method `age’ for User:Class

Tienes un poco de confusión entre los métodos de clase y de instancia:
los métodos con “self.” delante son de clase y se aplican sobre User
(la clase); los métodos sin “self.” son de instancia y debes
aplicarlos sobre una instancia (es decir, sobre un @user, por
ejemplo). “read_attribute” es un método de instancia, por eso no
puedes aplicarlo sobre una clase.

No lo se, pero las bases de datos están para almacenar datos, Ruby
sirve muy bien para calcular esos datos. Cada uno con su tarea.

La cuestion de MySQL es para filtrar los usuarios segun un rango de
edades partiendo de la fecha de nacimiento. Supongo que sera mejor que
ya lo filtre la base de datos.

En ese caso el filtrado en la base de datos es la única
solucióninteresante (si no quieres desnormalizar). Serabe te ha dado la
solución en otra respuesta.