Rails 4 - 在两个不同的数据库表上动态映射模型

时间:2015-07-30 07:31:22

标签: ruby-on-rails ruby-on-rails-4 model-view-controller rails-activerecord ruby-on-rails-4.2

我有一个多域应用程序与遗留数据库交谈。 在该DB中,我有两个名称不同的表,我们称之为USER_AUSER_B。它们的结构和数据类型完全相同,唯一的区别是它们从不同的域获取数据。

现在,我希望有一个single scaffold (model/controller/view),根据域名,映射到正确的数据库表。

域A可以使用名为User的模型/控制器,它在内部映射到db表USER_A,而域B可以使用相同的模型/控制器User,但映射到表USER_B

我还希望在我的路线中使用resource :user来访问模型轨道。

所以我需要在初始化时覆盖模型,但我不太清楚如何去做。

如何使用Rails ActiveRecord进行此操作?

1 个答案:

答案 0 :(得分:0)

我没有准备好测试多个数据库,所以这是对解决方案的有根据的猜测:

# respective models
class User < ActiveRecord::Base
end

class DomainAUser < User
  self.table_name = "USER_A"
end

class DomainBUser < User
  self.table_name = "USER_B"
end

# controller
def set_user
  @user = if request.subdomain(0) == "DomainA" 
            DomainAUser.find(params[:id])
          else 
            DomainBUser.find(params[:id])
          end
end

编辑:这是元编程hackery的另一个选择,它在父类本身内进行子类实例化。经过测试和工作。

我真的不想保持这样的东西。

# model
class User < ActiveRecord::Base
  def self.for_domain(domain_suffix)
    class_eval "class DomainUser < User; self.table_name='user_#{domain_suffix}'; end"
    "User::DomainUser".constantize
  end
end

# controller
User.for_domain("a").new
相关问题