Esta es una solución que se me ocurrió para hacerme más cómodo el trabajo con el atributo created_at de un modelo, por ej:
Para saber el año de creación de un post, haríamos lo siguiente:
>> p = Post.find(1) >> p.created_at.month => 6
como podemos observar retorna 6, pero resulta que yo lo necesito necesito con el siguiente formato: "06". Lo mismo pasa con el día:
>> p = Post.find(1) >> p.created_at.day => 4
module ActsAsDatedef year created_at.strftime("%Y") end
def month created_at.strftime("%m") end
def day created_at.strftime("%d") end
def year_month [year, month] end
# Armo un string para usarlo en un find # ej: # params = {:year => "2008", :month => "06"} # Post.all(:conditions => Post.created_at_conditions(params)) # def self.included(klass) klass.class_eval do def self.created_at_conditions(params) return nil if params[:year].blank? or params[:month].blank? "created_at like '#{params[:year]}-#{params[:month]}%'" end end end
end
Entonces tenemos que incluir este módulo en modelo que lo queremos usar:
class Post < ActiveRecord::Baseinclude ActsAsDate
end
Ahora con esto directamente hago p.month, p.day, p.year y obtengo el mes, día y año de creación del post con el formato que necesito y escribiendo menos código :). Además agregué un método que me arma el param conditions, que se podría un usar así por ej:
class PostsController < ApplicationController
def list @posts = Post.paginate( :page => params[:page], :order => 'created_at DESC', :conditions => Post.created_at_conditions(params) )
respond_to do |format| format.html format.xml { render :xml => @posts } end end
end
De esta manera no tengo que estar preguntando en el controller si vienen (year y month) como parámetros, por ahora este modulo sólo funciona con el atributo created_at por que está hardcodeado, pero con pocas modificaciones se podría hacer que funciona para cualquier atributo. Ahora lo que me pregunto es si Rails ya tiene alguna solución mejor para este problema, si alguien la conoce que me lo haga saber por favor (yo no la encontré), además se aceptan modificaciones, sugerencias y comentarios.
Comentarios del archivo (2)
gazer · 11 de diciembre de 2008
Deberías hacerle un sanitize_sql_for_conditions al '#{params[:year]}-#{params[:month]}%' para evitar un SQL Injection.
Gastón Ramos · 13 de diciembre de 2008
Sí tenés razón! :/ gracias!, tengo que prestar más atención a esas cosas.