首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails4-将模型动态映射到两个不同的数据库表上

Rails4-将模型动态映射到两个不同的数据库表上
EN

Stack Overflow用户
提问于 2015-07-30 15:31:22
回答 1查看 854关注 0票数 0

我有一个与传统数据库对话的多域应用程序。在数据库中,我有两个具有不同名称的表,我们称它们为USER_AUSER_B。它们的结构和数据类型完全相同,唯一的区别是它们从不同的域获取数据。

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

域A将使用名为User的模型/控制器,该模型/控制器在内部映射到数据库表USER_A,而域B将使用相同的模型/控制器User,但映射到表USER_B

我还想在我的路线中使用resource :user,以rails的方式访问模型。

因此,不知何故,我需要在初始化时覆盖模型,但我不太确定如何进行。

如何使用Rails ActiveRecord来解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2015-07-30 15:49:45

我还没有一个可以测试的多表DB,所以这是一个有根据的解决方案:

代码语言:javascript
运行
复制
# 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

编辑:这是另一种元编程技巧,它在父类本身内部实例化子类。经过测试并正常工作。

不过,我真的不想维护这样的东西。

代码语言:javascript
运行
复制
# 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31717695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档