我想在请求期间动态更改 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
但是,尽管请求完成后不再使用传递的模型类,但它会导致内存泄漏。 :(
有更好的方法吗?
我会使用类变量:
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中,如果不存在则添加它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)