我有一个多域应用程序与遗留数据库交谈。
在该DB中,我有两个名称不同的表,我们称之为USER_A
和USER_B
。它们的结构和数据类型完全相同,唯一的区别是它们从不同的域获取数据。
现在,我希望有一个single scaffold (model/controller/view)
,根据域名,映射到正确的数据库表。
域A可以使用名为User
的模型/控制器,它在内部映射到db表USER_A
,而域B可以使用相同的模型/控制器User
,但映射到表USER_B
。
我还希望在我的路线中使用resource :user
来访问模型轨道。
所以我需要在初始化时覆盖模型,但我不太清楚如何去做。
如何使用Rails ActiveRecord进行此操作?
答案 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