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: festivalttsOnRails, rails, ruby, RubyOnRails
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_querierLos 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:
- Página del proyecto: http://meta-rails.rubyforge.org
Etiquetas: metarails, rails, ruby, RubyOnRails
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: rails, railsconfeurope2007, ruby, RubyOnRails
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:
- Instalar las librerías de tts y de generación de mp3:
sudo apt-get install festival lame - Instalar el plugin festivalttsOnRails para Ruby on Rails:
script/plugin install \
svn://rubyforge.org/var/svn/festivaltts4r/plugins/festivaltts_on_rails - 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:
- Instalar las librerías de tts y de generación de mp3:
sudo apt-get install festival lame - Instalar la gem festivaltts4r:
sudo gem install festivaltts4r - 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: festivaltts4r, festivalttsOnRails, rails, ruby, RubyOnRails, text-to-speech
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:
- 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 - Ejecutamos scribble:
cd scribble
bin/scribble
Con esto ejecutaremos Scribble! y podremos hacer dibujos como este:

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 ;)
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:
- #7850: [PATCH] Added missing backticks to mysql adapter
- #4905[PATCH] Rails should backtick table names automagically
- #3631: table names should be quoted
- #1633: [PATCH] quote_column_name in ActiveRecord::ConnectionAdapters ...
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: rails, ruby, RubyOnRails
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:
- Hpricot: http://code.whytheluckystiff.net/hpricot/
- Mechanize: http://mechanize.rubyforge.org/mechanize/
Instalar sqlite3 para rails en Ubuntu
- Instalar sqlite y sus librerías de desarrollo:
sudo apt-get install sqlite3 libsqlite3-dev - 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.) - 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 - 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: rails, ruby, RubyOnRails, ubuntu
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.
- 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 - 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: rails, ruby, RubyOnRails
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 comandocap 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
endUna 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: capistrano, rails, ruby, RubyOnRails
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
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:
- http://ar.rubyonrails.org/
- Rails: ActiveRecord Serialize method
- Querying serialized data in ActiveRecord
Etiquetas: rails, ruby, RubyOnRails
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:
- Escoger la clase a evolucionar y definirle los métodos
fitness,combineymutate. - Con un array de instancias de la clase anterior (población inicial) crear un objeto de tipo GeneticAlgorithm.
- Llamar a la función
evolvede la clase GeneticAlgorithm tantas veces como quieras.
Más documentación y ejemplos en:
- Página web: http://gga4r.rubyforge.org/es
- Proyecto en rubyforge: http://rubyforge.org/projects/gga4r
- Página web en inglés: http://gga4r.rubyforge.org
Etiquetas: algoritmosGeneticos, gga4r, inteligenciaArtificial, ruby
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.
- (este punto es específico de Site5) Pedir que te cambien el shell por defecto de jailshell a bash.
- Configurar el entorno de desarrollo: desde el subdirectorio de tu aplicación rails ejecutar
cap --apply-to . NOMBRE_APLICACIONeste comando generará:
exists config
create config/deploy.rb
exists lib/tasks
create lib/tasks/capistrano.rake - Editar las opciones de configuración: en el archivo config/deploy.rb
- Indicar la URL del repositorio subversion:
set :repository, "svn+ssh://USUARIO@DOMINIO/RUTA_DEL_REPOSITORIO" - 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" ).
- 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}" - 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" - 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
- Indicar la URL del repositorio subversion:
- Configurar el servidor: Ejecutar desde la raiz de la aplicación el comando
cap setup - 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 - 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: hosting, rails, ruby, RubyOnRails
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: ruby
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.
- ¿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). - ¿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. - ¿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 ;) - ¿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: rails, ruby, RubyOnRails
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: rails, ruby, RubyOnRails
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:
- Página web: http://bn4r.rubyforge.org/es
- Proyecto en Rubyforge : http://rubyforge.org/projects/bn4r
- Página web en inglés: http://bn4r.rubyforge.org
Etiquetas: bn4r, inteligenciaArtificial, ruby
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: rails, ruby, RubyOnRails
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ó utilizarprint 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: rails, ruby, RubyOnRails



