2011-09-08 10 views
6

Quiero cambiar dinámicamente el nombre de la tabla de la clase de modelo ActiveRecord durante la solicitud.Rails 3/ActiveRecord: ¿Cómo cambiar/cambiar el nombre de la tabla durante la solicitud de forma dinámica?


Por ejemplo, hay muchas mesas que tienen una estructura similar (columnas):

mydb: 
    sample_data_12222 
    sample_data_12223 
    sample_data_12224 
    sample_data_12225 
    ... 

Por lo tanto, lo que yo quiero hacer es ...

_1. Definición de la clase de modelo base como:

class SampleData < ActiveRecord::Base 

_2. Cambio de la tabla de destino durante la petición como:

def action_method 
    SampleData.set_table_name "sample_data_#{params[:id]}" 
    @rows = SampleData.all 

Parece que por encima de código es correcto si se ejecuta en entorno no roscada (como en pasajeros/mod_rails). Pero es no seguro para subprocesos, por lo que puede no funcionar en entornos con rosca (como en JRuby-Rack).

También probé la creación de la clase delived así:

def action_method 
    @model_class = Class.new(SampleData) 
    @model_class.set_table_name "sample_data_#{params[:id]}" 
    @rows = @model_class.all 

Pero causa pérdidas de memoria, aunque la clase del modelo delived no se utiliza más después de la solicitud se completó. :(


¿Hay una mejor manera de hacer eso

+0

Gracias por su idea, estaba buscando algo similar (pero un poco más simple). Espero que mi respuesta (todavía) lo ayude @ – Veger

+0

Gracias, y lo siento por marcar su respuesta aceptada. ;) Llegué a algo similar a tu respuesta. – kaorukobo

Respuesta

6

me gustaría utilizar variables de clase:?

class SampleData < ActiveRecord::Base 
    class << self 
    @@model_class = {} 

    # Create derived class for id 
    @@model_class[id] = Class.new(SampleData) 
    @@model_class[id].set_table_name "sample_data_#{id}" 
    # Repeat for other IDs 
    end 
end 

Ahora puede utilizar las clases derivadas y otra vez, sin causar pérdidas de memoria

Dependiendo de su situación real (por ejemplo, no conoce las identificaciones de antemano), puede verificar si la identificación ya está presente en la función Hash dinámicamente y agregarla si no.

+0

¿Cómo usarías tu clase original y la clase @@ model_class [id]? –

+0

@veger esta es una solución genial, pero no funciona para las asociaciones. usuario = SampleData.model_class [44] .find (2)/* tabla de consultas - sample_data_44 */ user.addresses/* tabla de consultas - direcciones, no addresses_44 */ – kapso

+0

¿Debo hacer un ciclo si quiero 10 tablas? '# Repetir para otras ID's – Frexuz

Cuestiones relacionadas