0

我正在尝试将 Rails 与架构超出我控制范围的数据库一起使用。

关于这个数据库的一个要点是,一个单独的进程为特定的客户端生成表名,方式如下:

prefix_clientname1
prefix_clientname2
prefix_clientname3

所有这些表都具有相同的架构,但具有不同的数据。

创建模型来访问这些数据的最佳方式是什么?

ModelName.client("foo").find(:all)如果我不能通过类直接访问它们,我不一定会感到困扰:拥有类似或类似的 API可能很有用。

这甚至可以使用 ActiveRecord 还是我应该看一下 DataMapper 之类的东西?

4

1 回答 1

2

我想出的解决方案是定义一个通过元编程定义类的类。

class Orders
  def self.by_name(identifier)
    class_name = "Orders" + identifier.classify
    if Object.const_defined?(class_name)
      return Object.const_get(class_name)
    else
      new_class = Class.new(ActiveRecord::Base) do
        set_table_name 'orders_' + identifier
      end
      Object.const_set(class_name, new_class)
      return new_class
    end
  end
end

这使人们可以通过调用来访问表Orders.by_name

Orders.by_name("foobar").find(:all, :limit => 5)
OrdersFoobar.find(:all, :limit => 5)

显然,它们可以在启动时初始化。

于 2013-06-10T14:18:04.007 回答