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?

Todavía no hay comentarios

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Etiquetas HTML permitidas: <a> <blockquote> <br> <cite> <code> <dd> <div> <dl> <dt> <em> <h1> <h2> <h3> <h4> <h5> <h6> <hr> <img> <li> <ol> <p> <pre> <span> <strong> <swf> <table> <tbody> <td> <th> <tr> <ul>
    Allowed Style properties: background-color, background-image, border, border-bottom, border-bottom-color, border-bottom-style, border-bottom-width, border-color, border-left, border-left-color, border-left-style, border-left-width, border-right, border-right-color, border-right-style, border-right-width, border-spacing, border-style, border-top, border-top-color, border-top-style, border-top-width, border-width, color, direction, font, font-family, font-size, font-style, font-variant, font-weight, height, left, line-height, list-style-type, margin, margin-bottom, margin-left, margin-right, margin-top, padding, padding-bottom, padding-left, padding-right, padding-top, right, text-align, text-decoration, top, width
  • Syntax highlight code surrounded by the {syntaxhighlighter OPTIONS}...{/syntaxhighlighter} tags.
  • E-Mail addresses are hidden with reCAPTCHA Mailhide.

Más información sobre opciones de formato

CAPTCHA
Esta pregunta es para comprobar si eres un ser humano y evitar el envío automático desde sistemas de spam