2011-11-12 6 views
5

No estoy seguro de qué nombre debo darle a esta pregunta. Acabo de comenzar la programación del lado del servidor y necesito ayuda.Creación dinámica de nuevos modelos de Active Record y tablas de base de datos

Todos los tutoriales que he leído hasta ahora en RoR acuerdo con la creación de una mesa depredefinido y con pre-definido campos (id, nombre, correo electrónico, etc, etc). Usan ActiveRecord como clase base y guardar en db se maneja automáticamente por superclase.

Lo que estoy tratando de programar es algo que permite definido por el usuario tabla con campos. Entonces piensa en esta manera. La IU web tendrá una tabla vacía, el usuario nombrará la tabla y agregará columnas (campo), y luego agregará filas y luego las guardará. ¿Cómo implementaría esto? No pido detalles, solo una descripción general. Como dije, todos los tutoriales que he leído hasta ahora tratan con tablas predefinidas con campos donde la subclase de ActiveRecord está predefinida.

Así que en pocas palabras, estoy preguntando cómo crear tablas en db en runtime, y agregue campos a las tablas.

Espero que fuera claro, si no, por favor hágamelo saber y trataré de elaborar un poco más. Gracias.

+3

Si recién está empezando con la programación web del lado del servidor, ¿qué le parece comenzar con Hello world? :) Parece que de su pregunta quiere construir una base de datos controlada por web con una gran cantidad de meta programación. Sugiero dar pasos graduales hacia ello. De alguna manera puedo visualizar cómo se puede hacer lo que quieres, simplemente no lo expliques en "simplemente comenzando a hablar de programación del lado del servidor". Lo digo de la mejor manera. Ya? –

+1

Permitir que los usuarios ocasionales sean sus diseñadores de bases de datos es un negocio arriesgado y arriesgado. –

+1

Lo que estás tratando de hacer es realmente MUY AVANZADO y básicamente una mala idea incluso entonces (¡pero en realidad es bastante común para los novatos!). Los usuarios de un sistema deberían almacenar datos. Tenerlos creando tablas es solo un mal enfoque y una mala idea a menos que tal vez tengas una gran cantidad de experiencia en DBMS. El creador del esquema (usted en este caso) solo tiene que crear estructuras de datos flexibles que almacenarán lo que necesite. Solo olvide el enfoque de crear tablas de usuario. ¿Después de todo, estarían creando índices también? ¿Entienden que es único? ¿Entienden las uniones? llaves compuestas? yuch. –

Respuesta

2

A menos que esté compilando una herramienta de administración de bases de datos (e incluso entonces), permitirle al usuario acceso directo a la capa de la base de datos en la forma que sugiere es probablemente una mala idea. Además de los problemas de estabilidad y seguridad, se volverá realmente lento si los usuarios están creando muchas tablas.

Por ejemplo, si desea buscar un valor determinado en 100 de las tablas de sus usuarios, debe ejecutar 100 consultas por separado. El sitio se volvería exponencialmente más lento cuanto más tablas de usuario se crearan.

Una manera más sana de hacerlo podría ser la de contar con un modelo de mesa como esta

class Table < ActiveRecord::Base 
    has_many :fields 
    has_many :rows 
end 

Cada mesa tendría campos que se le atribuye, y filas para almacenar los datos correspondientes (que serían codificadas de alguna manera).

Sin embargo, como señala correctamente @Aditya, ¡esto no es realmente algo para principiantes!

+1

Este es el patrón de "plataforma interna". Está creando una base de datos "interna" utilizando una plataforma de base de datos existente, una que funcionará mal y será más difícil de entender que simplemente crear y modificar tablas reales. Sería mejor para él modificar dinámicamente el esquema de una base de datos o esquema separado de la aplicación, con ciertas precauciones de seguridad en su lugar. Estoy de acuerdo en que esto no es algo para principiantes, por supuesto. – fregas

1

Estoy de acuerdo con las respuestas anteriores en general. No está claro a partir de su pregunta por qué desea crear una tabla en tiempo de ejecución. No es realmente obvio cuál sería la ventaja de hacer esto. Si solo intenta almacenar datos que parecen encajar en una tabla con filas y columnas, ¿por qué no simplemente almacenarlos como una matriz en un campo de su tabla de usuarios? Si se permite que el usuario pueda crear muchas tablas, entonces usted podría tener algo como

class User < ActiveRecord::Base 
    has_many :tables 
    end 

y luego cada tabla puede tener un campo para almacenar una matriz serializada. O puede ir con la sugerencia de Alex: la mejor opción depende realmente de qué va a hacer con los datos, con qué frecuencia cambia, si necesita buscarla, etc. ...

1

Puede crear una base de datos como se muestra en los tutoriales, que almacena el nombre de las tablas y el nombre de sus columnas, las que su usuario desea.Entonces puede tener worker (que se puede construir usando Redis y Resque, here es simple Tut en Resque y Redis) y hacer que esos trabajadores ejecuten la migración (escribir migración con variables y usar params para reemplazarlos) para la nueva tabla en DB como pronto como se hace una nueva entrada en la base de datos. Dime si tienes preguntas sobre esto.

+1

él apenas está empezando. "Que se puede construir usando Redis y Resque" es una tontería. –

Cuestiones relacionadas