Enlaces e información

Comenta lo que creas oportuno.


Otros posts
Las leyes de Murphy aplicadas a .NET
Railes…

Relaciones entre entidades en Rails

Escrito por Roberto M. Oliva en Abril 16th, 2006

Una de las cosas que mas me estan sorprendiendo en Rails es la facilidad para crear los comportamientos entre las entidades de un sistema.
Mi primer proyecto en Rails ha sido una aplicación que me lleva rondando la cabeza unos meses. No es algo complicada, por eso he pensado que era una buena oportunidad para utilizarla en mi aprendizaje de Rails. La aplicación consiste en un sistema de Knowledgebase. Un lugar donde postear documentos de diversa indole (Ayudas, referencias, tutoriales, how-tos, etc.) . Ya hay varios pero este cumplía requisitos de funcionamiento específico.
Para empezar definí las siguientes entidades: Categorías y Temas. Una categoría es una agrupación lógica de categorias a su vez y de temas. Un tema comprende un documento de los antes descritos, pero con la peculiaridad de que puede pertenecer a varias categorías a la vez.
El comportamiento de estas dos entidades se implementan en Rails de una manera asombrosamente sencilla:

Entidad Categoría:

- Se comporta como un árbol de categorías.
- No puede haber dos subcategorías con el mismo nombre dentro de una categoría determinada.
- Deben de tener un Titulo, aunque la descripción es opcional.
- Pueden tener temas, aunque puede haber categorías vacías.

Pues este comportamiento se define en el modelo de Rails de la siguiente manera:

class Category < ActiveRecord::Base
has_and_belongs_to_many :topics, :join_table => “categorytopics”
acts_as_tree : order => “Titulo”
validates_uniqueness_of :Titulo, :scope => [:parent_id], :message => “No puede haber 2 subcategorias con el mismo titulo dentro de la misma categoria padre”
validates_presence_of :Titulo, :message => “Debe introducir un título”
end

Fijaros en la línea: validate_uniqueness_of :Titulo, :scope => [:parent_id] … A mi me parece impresionante.

Entidad Tema:

- Un Tema pertenece al menos a una categoria, aunque puede pertenecer a varias.
- El titulo de un tema es obligatorio.

class Topic < ActiveRecord::Base
has_and_belongs_to_many :categories, :join_table => “categorytopics”
validates_presence_of :Titulo, :message => “Debe introducir un título”
end

Pues con esto se definen las relaciones entre entidades y el modelo de la aplicación. Cuando empecé a mirar esto en Rails dudaba bastante de que cubriese todas las posiblidades existentes. Pero ahora estoy convencido de que cubre un porcentaje muy, muy amplio y de una manera muy sencilla.
Sencillo tambien es la programación con estos modelos:

Obtener la categoría padre de una determinada: @categoria.parent.
Obtener las categorías hijas de una determinada: @categoria.children.
Obtener los temas de una categoría: @categoria.temas.
Obtener las categorias de un tema: @tema.categorias.

Facil! no?



Escriba un comentario

Dediquele un momento a comentar lo que piensa. Esta permitido usar HTML básico para formatear el escrito.

Comentarios de los lectores

Sea el primero en dejar un comentario.