用户模型有三个键:is_master
,is_standard
,is_guest
,因为我原本想使用activerecord的布尔方法,如is_master
?还是is_power
?。
但是,如果最好创建一个UserType关系并创建我自己的方法:
def master?
return true if self.user_type = 1
end
答案 0 :(得分:2)
如果master / standard / guest关系是互斥的(也就是说,你只能是其中之一)那么存储类型的字段(以人类可读的形式,请 - 没有不透明的数字)是更好。您可以随时重新实现is_foo?
。
另一方面,如果您的帐户可以同时拥有多个master / standard / guest /的帐户,那么请坚持使用单独的布尔字段。
答案 1 :(得分:1)
作为一名DBA,我总是讨厌当人们使用列作为标志时,会有很多额外的列。 如果它是完全相同的类型(如帐户类型),我会像第一个anwer建议的那样(包括使用文本,而不是数字)。
另一方面,如果您需要单独的标志或多种类型(但数量有限),我实际上会进行二进制计算。
也就是说,表中有一列代表所有标志,然后为每个标志分配一个数字。
离。
FLAGS = {:master => 1, :standard => 2, :guest => 4, :power => 8,
:another_flag => 32, :yet_another_flag => 64}
def is_master?
self.flags & FLAGS[:master]
end
def is_standard?
self.flags & FLAGS[:standard]
end
设置值时需要更多的工作,但不会使用大量仅用于标记的列来使表混乱。
答案 2 :(得分:1)
如果你看一下restful认证插件是如何做到的(包括用户角色),他们会使用一个连接表。
我认为连接更具可读性。使用连接可以让您更灵活地使用角色系统。
如果您要求用户只能拥有一个角色,我会将该逻辑放在您的模型中。
答案 3 :(得分:1)
我从解决您当前需求的最简单的事情开始。根据需要重构并增加复杂性。听起来像一组布尔列就是你需要的。