En resumen, no hay una buena API de STI limpia para lo que está tratando de lograr a partir de ahora.
De hecho, me miró a los que hace aproximadamente un año y llegaron a la conclusión de que no es una buena idea por varias razones:
- Si desea utilizar las características específicas de PostgreSQL - que son básicamente casar con usted mismo a esa DB. No me malinterpretes PostgreSQL es una gran base de datos y la he usado en varias ocasiones, pero vas a quedarte atrapado con ese diseño de base de datos y de aplicaciones.
- Es muy probable que si comienzas a utilizar funciones específicas de DB, termines implementándolas manualmente (ejecutando algún tipo de comandos en la base de datos o usando la GUI) o escribiendo algún tipo de script que tendrás que invocar cuando estés ejecutando db: migrate (tendrá que hacerlo si quiere hacer las pruebas adecuadas). Después de un tiempo se vuelve engorroso y molesto.
- Si encuentra que son cada vez más molesto con, al citar que "tablas dolorosamente de ancho y '' columnas" de tipo entonces:
- Su diseño de la mesa tendrá que ser reconsiderada y se puede rehacer
- Sus modelos pueden no ser buenos candidatos para STI
- Solo tienes que vivir con eso.
mayoría de los problemas que realmente se reducen a esto: Esfuerzo vs Beneficio.
En su caso, debe hacerse esta pregunta:
- ¿Cuánto tiempo desea pasar en la implementación de una mejor ITS estructura si sólo acelerará su consulta SQL prima por unos segundos ? ¿Tal vez es mejor escribir una consulta SQL más explicativa? La mayoría de las aplicaciones no crecen hasta el tamaño en que realmente se convierte en un problema. Pero tal vez sea diferente en tu caso.
PS:
También un consejo rápido en la estructuración de las ITS en su aplicación: Si usted encuentra que usted tiene una gran cantidad de modelos que utilizan las ITS como un ProductCategory, CommentCategory, PhoneCategory, ClientCategory que todos heredan de Cateogory: tiendo a organizarlos en carpetas dentro del directorio de modelos. Luego, en application.rb sólo tiene que añadir una línea: config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]
"Así que todos sabemos que STI de los rieles (herencia de tabla única) es asqueroso porque conduce a un modelo de datos desordenado y una base de datos subóptima". --- No acepto esta premisa. –
Está bien, quizás sea una generalización ... Pero tiende a ser una buena idea cuando tus modelos infantiles no tienen muchas propiedades que no se aplican a los otros niños. De lo contrario, terminas con mesas enormes llenas de columnas anulables. Puede estar bien desde la perspectiva de los rieles, pero puede ponerse un poco feo cuando se ejecuta SQL sin formato en la base de datos, tal vez la herencia de PostgreSQL no sea más rápida, ¡pero al menos me oculta todo eso! : P –
Debido a que la herencia de Postgres encaja perfectamente, no creo que basta con tener una columna de 'tipo'. Por lo que he visto con herencia, 'SELECT *' devolvería todas las columnas asociadas (y creo que todas las columnas no asociadas también:/... Pero su estructura de base de datos estaría más limpia. – stuartc