Pregunta

Los tutoriales de RoR postulan un modelo por tabla para que funcione el ORM.Mi esquema DB tiene unas 70 tablas divididas conceptualmente en 5 grupos de funcionalidad (por ejemplo, cualquier tabla dada vive en un solo grupo funcional, y las relaciones entre tablas de diferentes grupos se minimizan). Entonces:¿Debo diseñar un modelo por grupo conceptual, o debería simplemente tener modelos de 70 Rails y dejar la agrupación "conceptual"?¡Gracias!

¿Fue útil?

Solución

Cubro esto en una de mis aplicaciones grandes simplemente asegurándome de que las tablas/modelos estén agrupados conceptualmente por nombre (con una relación tabla-modelo casi 1:1).Ejemplo:

events
event_types
event_groups
event_attendees
etc...

De esa manera, cuando uso TextMate o lo que sea, los archivos del modelo están bien agrupados por orden alfa.Tengo 80 modelos en esta aplicación y funciona lo suficientemente bien como para mantener todo organizado.

Otros consejos

Lo más probable es que tengas 70 modelos.Puede asignar espacios de nombres a los modelos para que tengan 5 espacios de nombres, uno para cada grupo, pero eso puede ser más problemático de lo que vale la pena.Lo más probable es que tenga alguna funcionalidad común en cada grupo.En ese caso, crearía un módulo para cada grupo que contuviera su comportamiento y lo incluiría en cada modelo relevante.Incluso si no hay una funcionalidad compartida, esto puede permitirle consultar rápidamente un modelo para su grupo conceptual.

Definitivamente deberías usar un modelo por tabla para aprovechar toda la magia de ActiveRecord.

Pero también puedes agrupar tus modelos en espacios de nombres usando módulos y subdirectorios, para evitar tener que administrar 70 archivos en tu directorio de modelos.

Por ejemplo, podría tener:

app/models/admin/user.rb
app/models/admin/group.rb

para los modelos Admin::Usuario y Admin::Grupo, y

app/models/publishing/article.rb
app/models/publishing/comment.rb

para publicación::Artículo y publicación::Comentario

Etcétera...

Sin conocer más detalles sobre la naturaleza de las setenta tablas y sus relaciones conceptuales no es realmente posible dar una buena respuesta.¿Son estas tablas heredadas o las ha diseñado desde cero?

¿Las tablas están relacionadas por algún tipo de patrón de herencia o podrían estarlo?Rails puede realizar una forma limitada de herencia.Busque Herencia de tabla única (STI).

Personalmente, me esforzaría mucho en evitar trabajar con setenta tablas simplemente porque supone una enorme cantidad de trabajo: setenta modelos y controladores y sus más de 4 vistas, ayudas, diseños y pruebas, sin mencionar el problema de carga de memoria que supone mantener el diseño en ind.A menos, por supuesto, que me pagaran por hora y lo suficientemente bien como para compensar la repetición.

Antes de lanzarte a hacer 70 modelos, considera esta pregunta para ayudarte a decidir:

¿Cada una de sus tablas se consideraría un "objeto", por ejemplo, una tabla de "automóviles", o algunas de las tablas contienen solo información de relaciones, por ejemplo, todas las columnas de clave externa?

¡En Rails sólo las tablas de "objetos" se convierten en modelos!(Con alguna excepción para tipos específicos de asociaciones) Por lo tanto, es muy probable que si tiene solo 5 grupos de funcionalidades, es posible que no tenga 70 modelos.Además, si los grupos de funciones que mencionaste son muy diferentes, es posible que incluso se adapten mejor a su propia aplicación.

Puede haber una pequeña cantidad de casos en los que pueda utilizar el modelo de herencia de tabla única estándar de Rails.Quizás todas las clases de un grupo funcional particular tengan los mismos campos (o casi todos los mismos).En ese caso, aprovecha las ofertas de DRYness STI.Sin embargo, cuando no tenga sentido, utilice clase por tabla.

En la versión de clase por tabla, no se puede incorporar fácilmente una funcionalidad común a una clase base.En su lugar, introdúzcalo en un módulo.Una jerarquía como la siguiente podría resultar útil:

app/models/admin/base.rb - module Admin::Base, included by all other Admin::xxx
app/models/admin/user.rb - class Admin::User, includes Admin::Base
app/models/admin/group.rb - class Admin::Group, includes Admin::Base

Ya se mencionó, es difícil dar un consejo decente sin conocer el esquema de su base de datos, etc.; sin embargo, me inclinaría por crear más de 70 modelos (uno para cada una de sus tablas).

Es posible que pueda deshacerse de algún modelo, pero por el costo (insignificante) también puede tenerlos allí.

No es necesario crear un controlador + vistas para cada modelo (como respondió srboisvert).Solo necesita un controlador para cada recurso (que yo esperaría que fuera mucho menos de 70, probablemente solo 10 o 15, a juzgar por su descripción).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top