Acts as date Module
by Gastón Ramos
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 ActsAsDate def 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::Base include 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.
Deberías hacerle un sanitize_sql_for_conditions al ‘#{params[:year]}-#{params[:month]}%’ para evitar un SQL Injection.
LikeLike
Sí tenés razón! :/ gracias!, tengo que prestar más atención a esas cosas.
LikeLike