Rails - 我应该使用布尔字段还是关系表?

时间:2009-01-29 21:58:13

标签: ruby-on-rails ruby activerecord

用户模型有三个键:is_masteris_standardis_guest,因为我原本想使用activerecord的布尔方法,如is_master?还是is_power?。

但是,如果最好创建一个UserType关系并创建我自己的方法:

def master?
   return true if self.user_type = 1
end

4 个答案:

答案 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)

我从解决您当前需求的最简单的事情开始。根据需要重构并增加复杂性。听起来像一组布尔列就是你需要的。