BetterNestedSet en Rails 2.1
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
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
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
rmyy se conecta por defecto a desarrollo o
rmy py nos conectamos a producción…
Otro… ahora que la última versión de RoR incorporó la tarea de poder ver las rutas con
rake routeesta bueno, pero es otro dolor de culo tener que buscar una ruta y escribir
rake route | grep usuariospara 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 mysqlpara 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
!128y 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
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
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.
