具有设计的表用户的自定义table_name

时间:2013-03-07 14:40:33

标签: ruby-on-rails devise

对于我的应用,我有几个用户表(franceusers,belgiumusers,...),我想根据域使用一个或另一个 我尝试使用table_name_prefix和table_name,但似乎无法正常工作

class User < ActiveRecord::Base
rolify
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable, #:confirmable,
:recoverable, :rememberable, :trackable, :validatable

def self.table_name
debugger
'franceusers'
end

def self.table_name_prefix
debugger
'france'
end
end

感谢调试器,我可以看到它被调用但不是self.table_name_prefix。即使调用self.table_name,也要在表用户而不是franceusers中设计搜索用户

在控制台中 User.table_name =&gt; “franceusers”

User.table_name_prefix =&gt; “法国”

更奇怪,我也使用activeadmin,当我浏览用户列表时,我有一个错误: Mysql2 ::错误:'order clause'中的未知列'franceusers.id':SELECT users。* FROM users ORDER BY franceusers.id desc LIMIT 30 OFFSET 0

它似乎可以找到table_prefix for field但不能找到FROM。

我做坏事吗?是否有另一种方法来更改用户表名? 我不能将所有用户表连接成一个,因为它是我老板的指令:-s

感谢

1 个答案:

答案 0 :(得分:0)

如果您有不同类型的用户,并且您有上述要求,他们必须每个都在不同的数据库中,那么我可能只为每个数据库创建一个用户类(假设我们正在谈论5-10而不是100s )。

拥有FranceUser和SpainUser等。然后将常用设计逻辑提取到一个模块中,您可以在每个类中包含该模块。您还需要覆盖login / register / etc控制器,以便能够将各个表连接在一起并搜索正确的用户。您还需要在多个数据库表中实现电子邮件唯一性约束等操作。基本上它听起来像一个非常糟糕的主意,你将不得不做很多工作,否则你可以通过设计免费获得。

这是可行的,但我建议你找出你的老板讨厌将你的数据分成多个表然后找到更好的方法来解决他的问题的用例。它可能只是简单的事情,想要简单的报告,并且有更简单,更优雅的方法来解决这些问题,而不是使用设计,然后覆盖其一半的功能。

祝你好运:)