Skip to content

Instantly share code, notes, and snippets.

@drodriguez
Created April 27, 2009 20:27
Show Gist options
  • Save drodriguez/102704 to your computer and use it in GitHub Desktop.
Save drodriguez/102704 to your computer and use it in GitHub Desktop.
def month_names_between
# No hay necesidad de convertir en string para comparar
return [I18n.l(fecini, :format => '%B')] if fecini.month == fecfin.month && fecini.year == fecfin.year
# De nuevo, no hay necesidad de convertir en string y luego en entero.
# Además utilizo nombres más descriptivos.
anio_inicio = fecini.year
anio_final = fecfin.year
mes_inicio = fecini.month
mes_final = fecfin.month
# Mejor nombre para esta variable
meses = []
# El bucle y las ramas detro de él tienen muchos agujeros.
# 1) si anio_inicio == anio_final no se necesita entrar en un bucle
# 2) el iterador (i), excepto en la última iteración siempre es menor a anio_final
# 3) a pesar de ello, en esa rama solo iteras desde el mes de inicio, pero si hay dos
# años entre medias, la has fastidiado.
# 4) Creo que utilizas una variable "l" que no veo por ningún sitio.
if anio_inicio == anio_final
meses += (mes_inicio..mes_final).inject([]) { |memo, mes| memo << [mes, anio_inicio] }
else
# Siempre se incluye el primer año
meses += (mes_inicio..12).inject([]) { |memo, mes| memo << [mes, anio_inicio] }
# Iteramos desde el siguiente año a uno menos del último
(anio_inicio+1...anio_final).each do |anio|
# Incluimos los 12 meses de cada año intermedio
meses += (1..12).inject([]) { |memo, mes| memo << [mes, anio] }
end
# Incluimos el año final
meses += (1..mes_final).inject([]) { |memo, mes| memo << [mes, anio_final] }
end
# De nuevo no hay necesidad de tener una fecha para convertir el mes a su nombre
meses.map { |mes, anio| "#{I18n.t("date.month_names")[mes]}-#{anio}" }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment