我想动态地在请求期间更改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
如果上面的代码在非线程环境中运行(例如在Passenger / mod_rails上),那么上面的代码似乎是正确的。 但它不是线程安全的,因此它可能无法在线程环境中工作(如在JRuby-Rack上)。
此外,我尝试创建这样的提供类:
def action_method
@model_class = Class.new(SampleData)
@model_class.set_table_name "sample_data_#{params[:id]}"
@rows = @model_class.all
但它会导致内存泄漏,尽管在请求完成后不再使用deliverd模型类。 :(
有更好的方法吗?
答案 0 :(得分: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是否已经动态地存在于Hash中,如果没有则添加它。