ruby-on-rails - rails 3/ActiveRecord : How to switch/change table name during request dynamically?

标签 ruby-on-rails ruby

我想在请求期间动态更改 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中,如果没有则添加。

关于ruby-on-rails - rails 3/ActiveRecord : How to switch/change table name during request dynamically?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7347570/

相关文章:

mysql - ActiveRecord:查询列不在数组中的位置

ruby-on-rails - 将原始 SQL 查询的结果转换为 JSON(和 CSV)

用于 Twitter 用户/站点流的 Ruby 库?

ruby-on-rails - 如何使用 Rails 在数据库中添加复合主键?

ruby - Ruby 正则表达式分组的量词

sql - Rails 如何从指向同一个表的联合关联中进行选择

ruby-on-rails - 带有 VSCODE 的 rdebug-ide 返回 cannot load such file --/app/app/rails 错误

ruby-on-rails - 将 RSpec 的 `all` 匹配器与 Capybara 的 `have_css` 匹配器一起使用时出错

ruby-on-rails - Capistrano 环境变量

ruby-on-rails - 使用回形针和 rails 缓存签名的 S3 URI