La aplicación Rails que habla

Después de varias semanas sin publicar nada y de unas vacaciones, he acabado un ejemplo de lo que se puede hacer con festivaltts para Ruby: Un aplicación en Ruby on Rails que habla!

Puedes probarla en: http://thetalkingrailsapp.sergioespeja.com/

De momento sólo funciona con la voz inglesa, espero que te de ideas para tus aplicaciones RoR!

Etiquetas: , , ,

Posted by Spejman at 10:08 p. m. | 2 comments read on

MetaQuerier Beta

MetaQuerier es un plugin para Ruby on Rails que una vez instalado infiere la estructura de la base de datos y de los modelos de la aplicación Rails. Permite hacer consultas, guardar consultas parametrizadas para utilizarlas más adelante y ver la estructura de base de datos.

No requiere ningún tipo de configuración ( a excepción de que tengas instalado ActsAsAuthenticated y quieras deshabilitarlo). Para instalarlo hay que ejecutar:
script/plugin install svn://rubyforge.org/var/svn/meta-rails/plugins/meta_querier
Los prerequisitos son tener una versión de Ruby on Rails mayor o igual a la 1.2.0 (y tener activada la constante RAILS_GEM_VERSION que encontrarás en /config/environment.rb) o en caso contrario, tener instalado el plugin engines.

Una vez instalado podemos crear las consultas (queries), accediendo al controlador /meta_querier (ej: http://localhost:3000/meta_querier)


Guardarlas parametrizadas (Save):


Ver un listado de las queries que existen (List):


Ejecutar las queries (Run):


Como puedes ver este plugin puede ser muy interesante para generar pantallas de administración o incluso pantallas de listados con un esfuerzo mínimo. Forma parte del proyecto MetaRails que pretende hacer Ruby on Rails todavía más Don't Repeat Yourself.

Queda trabajo por hacer, pero antes de continuar me gustaría estabilizar el código actual. Si te interesa puedes ayudarme instalándote el plugin, probando si te funciona y enviándome tus comentarios.

Más información:

Etiquetas: , , ,

Posted by Spejman at 12:04 p. m. | 0 comments read on

Mi charla ha sido seleccionada para la Railsconf Europe 2007

La propuesta "Making Rails More (Artificially) Intelligent" ha sido elegida para presentarla en la Railsconf Europe 2007 que se celebrará del 17 al 19 de septiembre de este año en Berlín.

Estoy muy contento porque será una gran oportunidad para charlar con algunas de las personas que más saben y más han contribuido al desarrollo de Ruby on Rails.

Mi charla tratará sobre como usar Inteligencia Artificial en las aplicaciones RoR. El uso de la IA en aplicaciones RoR permitirá crear ideas web más innovadoras y originales.

Si tienes previsto asistir a la conferencia, espero que encuentres la propuesta interesante y vengas a verla ;)

Etiquetas: , , ,

Posted by Spejman at 3:01 p. m. | 8 comments read on

Voz en tus aplicaciones Ruby on Rails

Acabo de publicar la primera versión utilizable de festivaltts4r junto con su plugin para Ruby on Rails festivalttsOnRails. Con esta librería y este plugin podrás hacer que tus aplicaciones Ruby y Ruby on Rails hablen!

El plugin para rails en ubuntu es muy sencillo de utilizar:
  1. Instalar las librerías de tts y de generación de mp3:

    sudo apt-get install festival lame

  2. Instalar el plugin festivalttsOnRails para Ruby on Rails:

    script/plugin install \
    svn://rubyforge.org/var/svn/festivaltts4r/plugins/festivaltts_on_rails

  3. Utilizar el método text_to_flash_player(text) en tus vistas:

    <%= text_to_flash_player "Talk me!" %>

Actualmente el plugin solo está disponible en la versión con voz inglesa, pero como prueba de concepto ya puede servir. En función del interés por el plugin y de la ayuda de la comunidad puedo ir mejorándolo.

He comprobado que funciona en Ubuntu linux, si puedes probarlo en otras plataformas te agradecería que me comentases como funciona ;)

También puedes utilizar la librería festivaltts4r para realizar aplicaciones de voz con Ruby en modo local. Al igual que el plugin, es muy fácil de instalar y usar:
  1. Instalar las librerías de tts y de generación de mp3:

    sudo apt-get install festival lame

  2. Instalar la gem festivaltts4r:

    sudo gem install festivaltts4r

  3. Incluir las gems necesarias y llamar al método to_speech con que se define en la clase String:

    require "rubygems"
    require "festivaltts4r"

    "I'm talking".to_speech

Este proyecto se ha realizado utilizando las librerías Festival TTS y lame.

El reproductor de mp3 en flash que reproduce la voz en el plugin para rails esta realizado por dew con la licencia Creative Commons Attribution-ShareAlike License France.

Más información en la página oficial del proyecto: festivaltts4r.rubyforge.org

Etiquetas: , , , , ,

Posted by Spejman at 7:30 a. m. | 3 comments read on

Dibujar con Ruby y Scribble!

Viendo el blog de nuevo blog de _why (http://hackety.org) descubrí Scribble! que es una versión en Ruby de NodeBox. Permite hacer dibujos muy chulos utilizando Ruby.

Si quieres probarlo en windows puedes seguir las instrucciones en http://nex3.leeweiz.net/posts/3

Yo quería probarlo en Linux, pero no encontré documentación relacionada por lo que tuve que investigar como instalarlo. Conseguí que funcionará en Ubuntu ejecutando lo siguiente:
  1. Instalamos las librerías cairo y gtk2 para ruby:

    sudo apt-get install libcairo-ruby1.8 libgtk2-ruby
    svn co svn://hamptoncatlin.com/scribble/trunk scribble

  2. Ejecutamos scribble:

    cd scribble
    bin/scribble

Con esto ejecutaremos Scribble! y podremos hacer dibujos como este:

Scribble! Screenshot

Este dibujo es prácticamente único ya que se genera aleatoriamente a partir de este código:

brush.fill = rand(0.1) + 0.9, rand(0.4) + 0.6, rand(0.1) + 0.9, rand(0.1)+0.1
blanket

brush.fill = rand(0.1) + 0.9, rand(0.4) + 0.6, rand(0.1) + 0.9, rand(0.1)+0.1
brush.stroke = rand(0.4) + 0.6, 0, 1, 0.2
brush.width = 2

100.times do
circle :center => [rand(size[0]), rand(size[1])], :radius => rand(50) + 10
end


Si te animas y creas algún dibujo chulo con Scribble! compártelo poniendo el código fuente como comentario en esta entrada ;)

Etiquetas: ,

Posted by Spejman at 12:00 p. m. | 1 comments read on

Palabras reservadas de MySQL como nombre de modelo

Al generar un modelo con una migration en ruby on rails creamos una tabla en la base de datos. El nombre de esta tabla será igual a la forma pluralizada del nombre del modelo. En MySQL esta migration generará una sentencia sql de la forma:

CREATE TABLE model_name_pluralized (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY,
`created_on` date DEFAULT NULL, `name` varchar(255) DEFAULT NULL) ENGINE=InnoDB

Como puedes ver, los nombres de las columnas están entre comillas pero el nombre de la tabla no. Si utilizas como nombre de modelo la forma en singular de una palabra reservada de MySQL, la migration generará una sentencia sql que dará un error como:

Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'databases (`id` int(11) DEFAULT NULL
auto_increment PRIMARY KEY, `created_on` da' at line 1: CREATE TABLE databases (`id` int(11)
DEFAULT NULL auto_increment PRIMARY KEY, `created_on` date DEFAULT NULL, `name` varchar(255)
DEFAULT NULL) ENGINE=InnoDB

La semana pasada leí unas transparencias de Josh Susser (Laying Tracks) que me animaron a escribir un parche para este problema.

Antes de escribir nada miré si podía encontrar algo relacionado. Encontre algún ticket similar en el trac de Rails:


El ticket más interesante de estos es el #4905, donde se corrigen todas las sentencias MySQL que pueden generar ese error. No se porque pero este parche no está incluido en el código de rails a pesar de ser del 25 de mayo de 2006. El tickert #7850 está cerrado al considerarse duplicado respecto el #4905. Y la história del ticket #3631 acaba con la frase "no usar palabras reservadas", lo cual en mi opinión no es la mejor solución.

En resumen, el problema existe (no se pueden crear modelos con nombres como "database", "exist", etc ...) y el parche también existe (#4905). Entoces,
que se debe hacer ahora para arreglar este problema?

Etiquetas: , ,

Posted by Spejman at 12:20 p. m. | 0 comments read on

Copia de seguridad de bloglines

Si eres usuario de bloglines (lector de feeds online) probablemente guardes los posts que te parezcan interesantes utilizando la opción "keep new".

Después de usar este lector de feeds durante un tiempo, la cantidad de posts interesantes que he guardado así es importante. Estuve pensado que no me haría ninguna gracia perder estos datos, por eso he hecho un script que hace un backup de estos posts en un archivo xml.

Este script me ha servido para probar dos librerías muy útiles de Ruby: mechanize y hpricot. Mechanize permite navegar por web utilizando comandos muy simples como podrás ver en el script. Hpricot permite parsear documentos html y xml de manera muy fácil e intuitiva.

Para usar el script necesitas instalar las siguientes librerías:

gem install json
gem install activesupport
gem install hpricot
gem install mechanize


Y aquí dejo el script, creo que se entiende bastante bien lo que hace. Espero que os ayude bien a hacer un backup de vuestra cuenta de bloglines (recuerda cambiar los valores EMAIL y PASSWORD) o bien a aprender un poco como funcionan mechanize y hpricot.

require "rubygems"
require "hpricot"
require "json"
require "mechanize"
require "active_support"

# Reads a bloglines javascript tree structure that has all
# feeds data.
def read_tree( tree_base, label = "" )
tree_base.each do |tree|
if tree["kids"]
read_tree tree["kids"], label + "/" + tree["n"]
else
@feeds << [tree["n"], label, tree["kn"], "http://www.bloglines.com/myblogs_display?sub=#{tree["id"]}&site=#{tree["sid"]}"]
end
end
end

# Add more memory to hpricot otherwise couldn't load some webs.
Hpricot.buffer_size = 262144

agent = WWW::Mechanize.new
page = agent.get 'http://www.bloglines.com/login'

form = page.forms[1]
form.email = 'EMAIL'
form.password = 'PASSWORD'

page = agent.submit form

# Get the bloglines sindicated feeds
menu_page = agent.get "http://www.bloglines.com/myblogs_subs"
start_text = "var initTreeData = "
end_text = "\n;\n"
js_feeds_tree_str = menu_page.content[menu_page.content.index(start_text)+start_text.size..menu_page.content.index(end_text)]
feeds_tree = JSON.parse js_feeds_tree_str.gsub("\\","")
@feeds = []
read_tree(feeds_tree["kids"])

puts "<bloglines_saves>"
@feeds.each do |feed|

page = agent.get feed[3]
doc= Hpricot(page.content)

# get the content of all saved feed posts
content = ((doc/"body")/"td.article")
next if content.empty?
puts "<feed name=\"#{feed[0].strip}\" folder=\"#{feed[1].strip}\">"

# Iterate each saved feed post
((doc/"body")/"a.bl_itemtitle").each_with_index do |title, index|
puts "<feed_save title=\"#{title.inner_html.strip}\" href=\"#{title.attributes["href"]}\">"
puts content[index].inner_html.to_xs
puts "</feed_save>"
end
puts "</feed>"

end
puts "</bloglines_saves>"

Más información:

Etiquetas: , ,

Posted by Spejman at 7:32 p. m. | 1 comments read on

Instalar sqlite3 para rails en Ubuntu

  1. Instalar sqlite y sus librerías de desarrollo:

    sudo apt-get install sqlite3 libsqlite3-dev

  2. Instalar la interfaz sqlite3-ruby para poder conectarnos a la base de datos sqlite3 desde Ruby.

    sudo gem install sqlite3-ruby
    (Si aparecen varias versiones a escoger, seleccionar
    la última versión para ruby.
    )

  3. Crear la base de datos, realmente solo creamos un archivo vacío que es lo único que necesita sqlite3.

    touch database_name_dev.db
    touch database_name_test.db
    touch database_name_prod.db

  4. Configurar la aplicación Ruby on Rails para usar estas bases de datos.
    Modificar el archivo config/database.yml:

    development:
    adapter: sqlite3
    database: db/database_name_dev.db

    test:
    adapter: sqlite3
    database: db/database_name_test.db

    production:
    adapter: sqlite3
    database: db/database_name_prod.db

Listo! a partir de aquí puedes desarrollar tu aplicación rails usando sqlite3 como base de datos.

Etiquetas: , , ,

Posted by Spejman at 8:12 p. m. | 2 comments read on

Crear controladores y vistas en plugins Ruby on Rails

Uno de los plugins que forman el proyecto meta-rails (http://meta-rails.rubyforge.org)
se encarga de hacer un diagrama de las clases de la aplicación y proporciona un generador
de consultas a estas clases. Para realizar esto necesitaba cargar controladores y sus vistas
directamente desde este plugin.

Después de documentarme y hacer pruebas he encontrado la manera de hacerlo fácil.

  1. Cargar los controladores
    Todos los plugins en ruby on rails pueden tener el archivo init.rb en su carpeta raiz
    que se ejecuta al cargar la aplicación rails. Este archivo es el hook (gancho) que podemos
    utilizar para introducir código del plugin en la aplicación rails.

    Si ponemos nuestros controladores en el subdirectorio del plugin app/controllers, para cargarlos
    podemos utilizar el código siguiente:

    directory = "#{RAILS_ROOT}/vendor/plugins/NOMBRE_DEL_PLUGIN"
    controller_path = File.join(directory, 'app', 'controllers')
    require "#{controller_path}/NOMBRE_DEL_CONTROLADOR.rb"
    $LOAD_PATH << controller_path
    if defined?(RAILS_GEM_VERSION) and RAILS_GEM_VERSION >= '1.2.0'
    Dependencies.load_paths << controller_path
    else
    raise "Engines plugin is needed for running NOMBRE_DEL_PLUGIN with \
    a Ruby on Rails version < 1.2.0" if Dir["#{RAILS_ROOT}/vendor/plugins/engines"].empty?
    end
    config.controller_paths << controller_path


    Analizando el código vemos que este código se ejecuta de manera diferente según utilizemos
    versiones de Ruby on Rails posteriores a 1.2.0 o previas. Esto es porque para que funcione
    en versiones anteriores a 1.2.0 necesitamos el plugin engines instalado (http://rails-engines.org).

    Una vez puesto este código podemos crear nuestros controladores haciendo que hereden de ActionController::Base:

    class MetaQuerierController < ActionController::Base

    def index
    render :text => "Funciona!"
    end

    end

  2. Vistas para nuestros controladores
    Una vez hemos cargado los controladores, tenemos que asignarles los subdirectorios donde pueden
    encontrar sus vistas. Esto lo hacemos con cambiando una variable de clase con self.template_root:

    class MetaQuerierController < ActionController::Base
    self.template_root = "#{RAILS_ROOT}/vendor/plugins/meta_querier/app/views/"
    end


Espero que te sea de utilidad, puedes encontrar más información en:
  • http://weblog.techno-weenie.net/2007/1/24/understanding-the-rails-initialization-process

Etiquetas: , ,

Posted by Spejman at 8:33 a. m. | 0 comments read on

Logs del servidor con capistrano

Acabo de probar esta "receta" para capistrano publicada por DrNic. La encuentro muy útil, permite ver los logs del servidor ruby on rails mediante el comando cap log.

Código a insertar en config/deploy.rb:
# logs
desc "Devuelve las últimas líneas del archivo de log. Uso: cap log [-s lines=200] [-s rails_env=production]"
task :log do
lines = configuration.variables[:lines] || 200
rails_env = configuration.variables[:rails_env] || 'production'
run "tail -n #{lines} #{current_path}/log/#{rails_env}.log" do |ch, stream, out|
puts out
end
end


Una vez insertado este código podemos utilizarlo así:
cap log
cap log -s lines=1000
cap log -s lines=1000 rails_env=development


Más información:

Etiquetas: , , ,

Posted by Spejman at 10:26 a. m. | 0 comments read on

Error "no such file to load — net/https" con Ruby en Ubuntu

Cuando utilizamos librerías en ruby que llaman a "net/https" en Ubuntu, habitualmente aparece el error:

custom_require.rb:27:in `gem_original_require’: no such file to load — net/https (MissingSourceFile)


A mi concretamente me ocurrió al instalar hpricot, una librería para parsear html fácilmente.

Para solucionarlo hay que instalar las librerías openssl-ruby:

apt-get install libopenssl-ruby

Etiquetas: ,

Posted by Spejman at 9:53 p. m. | 1 comments read on

Serializar objetos en Ruby on Rails con Active Record

Muchas veces nos es cómodo guardar en la base de datos estructuras de datos como arrays o hashes.

En Ruby on Rails podemos hacerlo fácilmente con el método serialize de ActiveRecord. Este método permite guardar objetos en un campo de la base de datos en formato texto. Utiliza el formato YAML para convertir el objeto a texto.



class Ejemplo < ActiveRecord::Base
serialize :datos
end

Ahora podemos utilizar la clase Ejemplo de la siguiente manera:



ej = Ejemplo.create(:datos => {'clave1' => 'atributo1', 'clave2' => 2 })
puts ej.datos['clave2']

Utilizar serialize nos puede ahorrar muchas líneas de código ;)



Más información:

Etiquetas: , ,

Posted by Spejman at 9:45 p. m. | 0 comments read on

Algoritmos genéticos para Ruby (gga4r) release 0.9

Algoritmos genéticos para Ruby (gga4r) es una librería para ejecutar algoritmos genéticos fácilmente.

En 3 pasos ya puedes trabajar con gga4r:
  1. Escoger la clase a evolucionar y definirle los métodos fitness, combine y mutate.

  2. Con un array de instancias de la clase anterior (población inicial) crear un objeto de tipo GeneticAlgorithm.

  3. Llamar a la función evolve de la clase GeneticAlgorithm tantas veces como quieras.


Más documentación y ejemplos en:

Etiquetas: , , ,

Posted by Spejman at 10:19 a. m. | 0 comments read on

Configurar capistrano en servidores compartidos

Esta es la configuración de capistrano para desplegar una aplicación en Site5 cuando tenemos el código en un repositorio subversion. Posiblemente puede utilizarse en otros servidores compartidos con ligeras modificaciones.

Para escribir este post he realizado un despliegue real de una aplicación, he consultado el tutorial que encontré en http://www.thebitguru.com/articles/9-Setting+up+Capistrano+on+Site5 y he utilizado el soporte de los técnicos de Site5 que me han ayudado durante el proceso con un problema de permisos que había en el servidor.

  1. (este punto es específico de Site5) Pedir que te cambien el shell por defecto de jailshell a bash.

  2. Configurar el entorno de desarrollo: desde el subdirectorio de tu aplicación rails ejecutar cap --apply-to . NOMBRE_APLICACION este comando generará:

    exists config
    create config/deploy.rb
    exists lib/tasks
    create lib/tasks/capistrano.rake

  3. Editar las opciones de configuración: en el archivo config/deploy.rb
    1. Indicar la URL del repositorio subversion:
      set :repository, "svn+ssh://USUARIO@DOMINIO/RUTA_DEL_REPOSITORIO"

    2. Poner las direcciones de cada rol de tu aplicación (web, app, db). Típicamente solo se utilizan :web y :app poniendoles el nombre del dominio (por ejemplo "bee.com.es" ).

    3. Descomentar la linea "deploy_set" indicándole la ruta correcta hacia el subdirectorio del servidor donde quieres que se instale la aplicación, por ejemplo:
      set :deploy_to, "/home/TU_USERNAME/apps/#{application}"

    4. Si el username del servidor es diferente del de la máquina desde donde usarás capistrano, descomenta la línea "user" y pon tu username:
      set :user, "TU_USERNAME"

    5. Añadir las siguientes tareas de capistrano al final del archivo:
      desc "Link in the production database.yml and fix permissions"
      task :after_update_code do
      run "find #{release_path}/public -type d -exec chmod 0755 {} \\;"
      run "find #{release_path}/public -type f -exec chmod 0644 {} \\;"
      run "chmod 0755 #{release_path}/public/dispatch.*"
      end

      desc "Restart the web server. Overrides the default task for Site5 use."
      task :restart, :roles => :app do
      run "chmod 755 #{current_path}/public/dispatch.fcgi"
      run "touch #{current_path}/public/dispatch.fcgi"
      end

  4. Configurar el servidor: Ejecutar desde la raiz de la aplicación el comando cap setup

  5. Cambiar la linea de public/.htaccess:
    RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
    por:
    RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
    Fíjate que solo es cambiar la extensión .cgi por .fcgi

  6. Listo! ahora para desplegar tu aplicación solo tienes que ejecutar desde la raiz de la aplicación el comando cap deploy


Posibles errores:
  • Si el protocolo de tu repositorio subversion es svn+ssh, es decir, utiliza ssh tienes que pedir que te perimitan realizar ssh desde el servidor porque por defecto lo tienen deshabilitado.

Etiquetas: , , ,

Posted by Spejman at 10:25 a. m. | 1 comments read on

Traducir código ruby del inglés a otros idiomas

La sintaxis de Ruby es muy cercana al lenguaje natural, esto facilita la lectura del código. Esta característica me hizo pensar la opción de traducir las palabras reservadas y los métodos de las clases más comunes de Ruby.

Esto permitiría acercar Ruby a más gente a parte de simplificar el desarrollo y mantenimiento de aplicaciones en comunidades no anglo parlantes.

Te imaginas:

vector_de_palabras.cada_uno haz |palabra|
imprime palabra
fin

En lugar de:

vector_de_palabras.each do |palabra|
print palabra
end


Esta idea tiene a priori ventajas/inconvenientes

Ventajas:
  • Código más legible por no anglo parlantes

  • Código más fácil de desarrollar

  • Mayor mantenibilidad


Inconvenientes:
  • Código menos estándar


Decisiones a tomar en cuenta para implementarlo:
  • Traducir sólo los métodos o traducir también palabras reservadas y sintaxis.

  • Cómo interpretar el nuevo código:

    • Crear versiones del interprete de ruby

    • Crear un parser que transforme el nuevo código ruby a código ruby estandar

    • Crear un DSL.

  • Utilizar o no acentos, dieresis, etc.


He creado un proyecto en rubyforge llamado políglota dónde organizar toda la información, ficheros y código relacionados.

La idea es crear un framework que permita traducir ruby a varios lenguajes, cuento con la ayuda de traductores titulados, gracias a ellos podremos conseguir unas traducciones más correctas.

Como puedes ver es una propuesta todavía muy verde, espero que te parezca interesante! Si quieres puedes colaborar explicándome tus impresiones en los comentarios o desarrollando partes del proyecto.

Etiquetas:

Posted by Spejman at 4:30 p. m. | 8 comments read on

Generador automático de consultas en Ruby on Rails

Estoy intentando hacer una especie de query builder en ruby on rails que permita al usuario crear consultas a la base de datos teniendo en cuenta todas las tablas y sus atributos.

Haciéndolo estoy aprendiendo mucho del código interno de ActiveRecord, os comento un par de trucos que he aprendido y alguna duda que me ha surgido.

  1. ¿Cómo sabe ActiveRecord las columnas de las tablas que forman los métodos de sus objetos? En mysql utiliza la query "SHOW FIELDS FROM nombre_tabla" y lo hace en el método ActiveRecord::Base.connection.columns(nombre_tabla).


  2. ¿Cómo saber las tablas que hay actualmente en la bd? Para saber esto he utilizado la sentencia sql de mysql "SHOW TABLES", ejecutando ActiveRecord::Base.connection.select_values("SHOW TABLES") obtenemos un array con todos los nombres de las tablas que hay en la bd.


  3. ¿Cómo saber que objetos ActiveRecord válidos hay en la aplicación RoR que estamos ejecutando a partir de la lista de nombres de tablas? Para hacer esto utilizo el siguiente código:

    table_names.each do |table_name|
    # comprobación de seguridad antes de hacer el eval.
    next if table_name.include?(";") or \
    table_name =~ /\s/
    table_name = table_name.classify
    begin
    activerecord_classes_names << table_name \
    if eval("#{table_name}.class == Class")
    rescue; end
    end

    No se si es la mejor manera, pero no se me ocurrió ninguna otra puesto que no he encontrado ningún método que me muestre las clases que existen en la aplicación, pero debe haberlo si tu lo sabes por favor dímelo ;)


  4. ¿Como saber las asociaciones que tiene un objeto ActiveRecord con otros objetos ActiveRecord? En la clase ActiveRecord existe el método de clase "reflections" que retorna un hash con los nombres de las asociaciones apuntando a objetos del tipo ActiveRecord::Reflection::AssociationReflection que, entre otros, tienen los siguientes atributos:
    • class_name: Nombre de la clase destino

    • macro: símbolo correspondiente al tipo de relación (has_many, belongs_to, ...)

Etiquetas: , ,

Posted by Spejman at 1:10 p. m. | 5 comments read on

Ver que attributos tiene un objeto ActiveRecord

El plugin annotate models nos permite ver los atributos de una clase ActiveRecord (columnas de la tabla en la base de datos) de manera cómoda en el código de la clase. Es muy útil para no tener que estar consultando la estructura de la base de datos al olvidarnos de los métodos de una clase, de manera que podremos programar más rápido y no repetir declaraciones (DRY) ya que lo hace automáticamente.

Consiste en una tarea para rake que al ejecutarla nos escribe en las cabeceras de las clases del modelo la información asociada que obtiene de la base de datos. Por ejemplo:

# == Schema Information
# Schema version: 39
#
# Table name: signatures
#
# id :integer(11) not null, primary key
# lema :string(255)
# language_id :integer(10) default(0), not null
# domain_id :integer(10) default(0), not null
# created_on :date
# category_id :integer(10) default(0), not null
# linguistic_cue_group_id :integer(10) default(0), not null
#


Cómo instalarlo:
      1. Instalar el plugin
      script/plugin install \
      http://svn.pragprog.com/Public/plugins/annotate_models

      2. Ejecutar el script que anota los modelos
      rake annotate_models


Referencias:

Etiquetas: , ,

Posted by Spejman at 12:19 p. m. | 2 comments read on

Redes Bayesianas para Ruby (bn4r) release 0.9

Redes Bayesianas para Ruby (bn4r) permite crear, modificar, resolver, importar y exportar redes bayesianas, pruébalas y infiere alguna probabilidad con ellas!

Esta entrega incluye soporte para nodos con variables discretas, ahora puedes usar nodos en las redes con valores como {poco, normal, mucho, muchísimo} en lugar de {cierto, falso}

La función de exportar a Microsoft Belief Network se ha mejorado.

Al igual que en entregas anteriores, puedes resolver tus redes mediante los algoritmos enumeration ask, prior sample, rejection sampling o likelihood weighting.

Se agradecerá ayuda con el testeo, si estás interesado puedes contactar conmigo en http://rubyforge.org/projects/bn4r o en sergio.espeja ( ya sabes ... ) gmail.com.

Más información:

Etiquetas: , ,

Posted by Spejman at 8:41 p. m. | 0 comments read on

ActiveRecord: diferencias entre save, save!, create y create!

ActiveRecord define varias maneras para guardar un objeto (instancia de un modelo) en la base de datos, es importante saber como actúa cada una para luego no tener sorpresas y usar el más adecuado en cada momento.

  • save: Devuelve true si el objeto se ha guardado correctamente, o nil en caso contrario. No genera ninguna excepción.


  • save!: Devuelve true si el objeto se ha guardado correctamente, y si no ha podido guardarse lanza una excepción con el error.
    Esta excepción es del tipo ActiveRecord::RecordInvalid, se lanza principalmente cuando hay errores de validación (campo obligatorio vacío, email no válido, etc ...) y la podemos usar para mostrar el error al usuario.


  • create: Retorna siempre el objeto independientemente de que se haya guardado con éxito o no, tenemos que consultar el objeto por si ha ocurrido algún error de validación.


  • create!: Aparece en Rails 1.2, yo no lo he podido probar todavía pero por lo que pone en Agile Web Development with Rails devuelve el objeto si se ha guardado con éxito, sino retorna una excepción al igual que save!



Más información:


Etiquetas: , ,

Posted by Spejman at 4:59 p. m. | 0 comments read on

Completar con el tabulador y colorear irb con Wirble

Hoy he probado Wirble siguiendo el tutorial en ingles de Ruby Inside y lo encuentro muy útil, sobretodo porque permite autocompletar con el tabulador! Se acabó utilizar print objeto.methods.sort.join("\n") cada vez que no te acuerdas del nombre de un método.

Para utilizarlo hay que instalar la gem:

gem install -y wirble


Y si utilizas linux hay que editar el archivo ~/.irbrc y añadir:

require 'rubygems'
require 'wirble'
Wirble.init
Wirble.colorize


En Windows no se como funcionará si alguien lo sabe que me lo diga y actualizo el post. En mac os supongo que funcionará igual.

Etiquetas: , ,

Posted by Spejman at 1:10 p. m. | 2 comments read on
Recommend Me


XING
View Sergio Espeja's profile on LinkedIn













Enlaces