2011-09-08 45 views
6

我要动态地请求期间改变的ActiveRecord模型类的表名。Rails 3/ActiveRecord:如何在请求期间动态切换/更改表名称?


例如,存在具有类似的结构(列)很多表:

mydb: 
    sample_data_12222 
    sample_data_12223 
    sample_data_12224 
    sample_data_12225 
    ... 

所以,我想要做的是...

_1。定义基本模型类如下:

class SampleData < ActiveRecord::Base 

_2。像请求期间更改目标表:

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

看来,上面的代码是正确的,如果是在非线程环境中运行(客运/ mod_rails等)。 但它不是线程安全,所以它可能不会在线程环境(像JRuby的机架)工作。

而且我试图创建内交类是这样的:

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

但它造成内存泄露,但请求完成后的内交模型类,不使用任何更多。 :(


有没有更好的办法来做到这一点

+0

谢谢你的想法,我一直在寻找类似的东西(但更简单一点)。希望我的答案将(仍然)帮助你@ – Veger

+0

谢谢,并且很抱歉标记你的答案被接受。 ;)我达到了类似于你的答案的东西。 – kaorukobo

回答

6

我会用类变量:

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 

现在你可以反复使用的派生类,不会造成内存泄漏。

根据您的实际情况(例如,你不知道事先的ID),你可以检查该ID是否已经存在于动态哈希,如果不添加它。

+0

你会如何使用你的原始类以及@@ model_class [id]类? –

+0

@veger这是很酷的解决方案,但不适用于关联。 user = SampleData.model_class [44] .find(2)/ *查询表 - sample_data_44 */ user.addresses/*查询表 - 地址,而不是地址_44 */ – kapso

+0

如果我需要10个表,我应该做一个循环吗? '其他IDs' – Frexuz