Enlaces e información
Comenta lo que creas oportuno.
- Otros posts
- Las leyes de Murphy aplicadas a .NET
- Railes…
Relaciones entre entidades en Rails
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? 