BetterNestedSet en Rails 2.1

Escrito por nelson Wed, 11 Jun 2008 01:18:00 GMT

Hay un plugin muy interesante para Rails llamado BetterNestedSet que permite generar modelos con generarquías anidades, el ejemplo clásico son las categorías de un producto, donde puede haber categorías de categorías.

El problema con este plugin es que no funciona bien con Rails 2.1, porque la última versión de Rails modifica los parámetros de un método que este plugin reemplaza.

Ya le envié el patch al autor, mientras tanto dejo acá también la actualización del método en el plugin para cualquiera que pueda necesitarlo.

#reemplazar este metodo en better_nested_set.rb
def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true, attribute_names = @attributes.keys)
  left_and_right_column = [acts_as_nested_set_options[:left_column], acts_as_nested_set_options[:right_column]]
  quoted = {}
  connection = self.class.connection
  attribute_names.each do |name|
    if column = column_for_attribute(name)
      quoted[name] = connection.quote(read_attribute(name), column) unless !include_primary_key && (column.primary || left_and_right_column.include?(column.name))
    end
  end
  include_readonly_attributes ? quoted : remove_readonly_attributes(quoted)
end

Inicialización no estandar de objetos ActiveRecord

Escrito por nelson Wed, 07 May 2008 18:21:00 GMT

Me estuve peleando con un modelo de ActiveRecord, porque tenía que manejar ciertos estados internos del modelo que no están en campos de la base de datos, sinó que son datos calculados cuando se carga un registro de la base de datos.

El primer intento lo hice haciendo una sobre escritura del método initialize de ActiveRecord pero muy pronto me di cuenta de que no funcionaba cuando se buscaba por un objeto con algún método find.

Luego de hacer muchas pruebas y que ninguna funcionara, terminé mirando la implementación de ActiveRecord a ver si encontraba alguna pista y si, ahí estaba.

Cuando se utiliza algún método de búsqueda, los objetos se instancian con un método llamado ‘instantiate’ y al finalizar se llama a dos callbacks si existen en la clase del modelo, que son :after_find y :after_initialize

Así que todo lo que tuve que hacer fue; mover el código de cálculo de estado del modelo a un método llamado ‘after_initialize’, y ahora anda todo perfecto !

Compartiendo algunos scripts

Escrito por nelson Mon, 28 Jan 2008 23:47:00 GMT

Seguramente la pereza es la madre de muchos de esos pequeños scripts que uno va haciendo para tratar de evitar todas las tareas repetitivas diarias. Acá dejo algunos de mi autoría y algunos que saque alguna vez de internet pero que lametablemente no tomé nota de donde o quien eran :(....

Muchas veces conectado remotamente a un servidor necesito acceder a la base mysql del proyecto RoR activo y es un dolor de culo tener que mirar el database.yml para ver las credenciales y luego escribir la línea a mano para conectarse, para evitar eso, escribí esto:

#! /usr/bin/ruby
require 'yaml'

puts ARGV[0]
case ARGV[0]
when 'd' then env = 'development'
when 'p' then env = 'production'
when 't' then env = 'test'
else
  env = 'development'
end

config = YAML::load_file('config/database.yml')[env]

puts "mysql -u#{config['username']} -p#{config['password']} #{config['database']}" 
system("mysql -u#{config['username']} -p#{config['password']} #{config['database']}")
de esta manera estando parado sobre el directorio raiz del proyecto se puede hacer
 rmy
y se conecta por defecto a desarrollo o
rmy p
y nos conectamos a producción…

Otro… ahora que la última versión de RoR incorporó la tarea de poder ver las rutas con

rake route
esta bueno, pero es otro dolor de culo tener que buscar una ruta y escribir
rake route | grep usuarios
para filtrar la vista… para eso ésta función en bash

rro () 
{ 
    rake routes | grep --color=auto $1
}

ahora solo hay que hacer

rro usuarios

y como plus se tiene el texto buscado resaltado en color ;).. una joyita….

Otra función bash que uso mucho basado en la misma idea es la de búsqueda en el history del bash

function hf()
{
  history | grep --color=auto $1

}
y esto para que ??.. aveces hay comandos largos con parámetros que repetirlos es tedioso, para evitar eso primero buscamos en el history
hf mysql
para obtener todos los comandos en el history que tenga el texto mysql y a la izquierda hay un número con la posición en el buffer, con ese número luego hacemos
!128
y se ejecuta esa entrada en el history ;)

Para terminar les dejo mi pequeño archivo de bash que cargo cada vez que abro una consola

alias l='ls -lah' 
alias h='history'
alias c='clear'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'

set -o vi

function hf()
{
  history | grep $1
}

function sf()
{
  svn st | grep \? | sed '/images\/[0-9]\+$/d' | sed '/\.swp/d'
}

function rro()
{
  rake routes | grep $1
}
como cargo este archivo ??... al final de .bashrc tengo:
. ~/bin/bash_alias

bash_alias es el nombre de mi archivo

Espero que a alguien le interese y le sirva!.

Ruby Hoedown 2007 Videos

Escrito por nelson Fri, 24 Aug 2007 00:55:00 GMT

En Confreaks están disponibles los videos de la conferencia Ruby Hoedown que se hizo hace un par de días. Hay un par de charlas muy buenas para ver.

También hay una entrevista Ezra Zygmuntowicz el creador de Merb entre otras cosas.

Para ponerlo en el bookmark y pasar un fin de semana entretenido.

via: InfoQ

Rhino sobre Rails

Escrito por nelson Sat, 14 Jul 2007 02:10:00 GMT

Leyendo un post de John Lam (es el que creador de RubyCRL y actualmente esta empleado por Microsoft) me entero que Steve Yegge dio una charla en Foo Camp titulada “Google Rails Clone” en la que comentaba el trabajo de portar Rails para funcionar sobre Rhino, una implementación de Javascript que funciona sobre Java.

Recomiendo mucho leer el post de Steve Yegg sobre el descargo de que es lo que realmente hicieron y porque reimplementaron sobre Javascript en vez de usar la versión original de Ruby. Muy interesante, para conocer algo de como se trabaja en Google.

Soy malo y les adelanto el final…... el código es de uso interno de Google y no va a ser liberado, al menos en el corto plazo.

Anteriores: 1 2 3 ... 6