我有一个与传统数据库对话的多域应用程序。在数据库中,我有两个具有不同名称的表,我们称它们为USER_A和USER_B。它们的结构和数据类型完全相同,唯一的区别是它们从不同的域获取数据。
现在,我希望有一个single scaffold (model/controller/view),根据域的不同,映射到正确的DB表。
域A将使用名为User的模型/控制器,该模型/控制器在内部映射到数据库表USER_A,而域B将使用相同的模型/控制器User,但映射到表USER_B。
我还想在我的路线中使用resource :user,以rails的方式访问模型。
因此,不知何故,我需要在初始化时覆盖模型,但我不太确定如何进行。
如何使用Rails ActiveRecord来解决这个问题呢?
发布于 2015-07-30 15:49:45
我还没有一个可以测试的多表DB,所以这是一个有根据的解决方案:
# 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编辑:这是另一种元编程技巧,它在父类本身内部实例化子类。经过测试并正常工作。
不过,我真的不想维护这样的东西。
# 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").newhttps://stackoverflow.com/questions/31717695
复制相似问题