2011-03-30 13 views
6

Estoy cambiando el table_name_prefix durante la ejecución de una aplicación de rieles (puede sonar raro, pero realmente eso es lo que quiero). Cuando el table_name_prefix cambia para el ActiveRecord restablezco los nombres de la tabla (table_name y quoted_table_name) llamando al reset_table_name, y cambian ... sin embargo, tengo otro problema.Cómo cambiar el nombre de la tabla de ActiveRecord durante el tiempo de ejecución

Si el nombre de la tabla cambia, después de llamar a tal elemento como count o a find, el objeto ActiveRecord sigue funcionando con la tabla, que se utilizó anteriormente.

¿Cómo se puede restablecer un descendiente ActiveRecord, de modo que cuando el prefijo, sufijo, nombre_tabla cambie, funcione con la nueva configuración?

Gracias por su ayuda!

+1

Dios mío, ¿por qué ibas a hacer esto? –

+0

no sé cómo podrías hacer eso, ¡pero esa es una pregunta! – Spyros

+0

@DonRoby suponga que desea cambiar entre conjuntos de datos, que se distinguen en función de table_name_prefix. Es como sharding db, pero no quiero tener una nueva base de datos, puedo usar solo un db con múltiples datasets. – fifigyuri

Respuesta

8

Encontré la explicación del comportamiento descrito. Aunque reset_table_name restablece el nombre de la tabla calculado a partir del prefijo, sufijo (y tal vez otras cosas también), la tabla se inicializa cuando se utiliza un modelo y se genera una consulta. ActiveRecord funciona "en la parte superior de" Arel, una gema de álgebra relacional. Cuando se utiliza un modelo ActiveRecord, se crea una tabla y se rellena la variable de instancia @arel_table. Este almacenamiento en caché es para fines de rendimiento. Si uno quiere recrear la tabla arel, puede reiniciar llamando al reset_column_information. Necesitaba tener ambos reset_table_name y reset_column_information para obtener una nueva tabla para el nuevo nombre de la tabla. Probablemente tendré que preocuparme por el rendimiento, si restablezco la tabla a menudo.

Cuestiones relacionadas