Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-我应该使用布尔字段还是关系表?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

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

Ruby on rails Rails-我应该使用布尔字段还是关系表?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,用户模型有三个键:is_master,is_standard,is_guest,因为我最初想使用的布尔方法是is_master?或者是电源 但是,如果创建用户类型关系并创建我自己的方法(如下所示)更好: def master? return true if self.user_type = 1 end 如果主/标准/来宾关系是互斥的(也就是说,您只能是其中的一个),那么存储类型的字段(请以人类可读的形式,不要使用不透明的数字)更好。您总是可以简单地重新实现is\u foo? 另一方面,如

用户模型有三个键:
is_master
is_standard
is_guest
,因为我最初想使用的布尔方法是
is_master
?或者
是电源

但是,如果创建用户类型关系并创建我自己的方法(如下所示)更好:

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

如果主/标准/来宾关系是互斥的(也就是说,您只能是其中的一个),那么存储类型的字段(请以人类可读的形式,不要使用不透明的数字)更好。您总是可以简单地重新实现
is\u foo?


另一方面,如果您的帐户可以同时是master/standard/guest/whatever中的多个,那么请使用单独的布尔字段。

如果master/standard/guest关系是互斥的(即,您只能是其中的一个),则使用存储类型的字段(请以人类可读的形式——不要使用不透明的数字)更好。您可以随时重新实现
is\u foo?


另一方面,如果您可以同时拥有一个master/standard/guest/以上的帐户,那么请坚持使用单独的布尔字段。

作为DBA,当人们使用列作为标志时,我总是讨厌,这将是大量额外的列。 如果是相同的类型(比如账户类型),我会按照第一个答案的建议去做(包括使用文本,而不是数字)

另一方面,如果您需要单独的标志或多个类型(但有一个限制的数字),我实际上会选择二进制计算

也就是说,在表中有一列表示所有标志,然后为每个标志分配一个数字


设置值时需要做更多的工作,但不会因为很多列只用于标志而使表变得杂乱无章。

作为DBA,当人们使用列作为标志时,我总是不喜欢,这会有很多额外的列。 如果是相同的类型(比如账户类型),我会按照第一个答案的建议去做(包括使用文本,而不是数字)

另一方面,如果您需要单独的标志或多个类型(但有一个限制的数字),我实际上会选择二进制计算

也就是说,在表中有一列表示所有标志,然后为每个标志分配一个数字


设置值时需要做更多的工作,但不会因为很多列只用于标志而使表变得杂乱无章。

如果您看看restful身份验证插件是如何做到这一点的(其中包括用户角色),它们会使用联接表

我认为联接更具可读性。使用联接可以使您的角色系统更灵活


如果您要求一个用户只能有一个角色,我会将该逻辑放在您的模型中。

如果您看看restful身份验证插件是如何做到这一点的(其中包括用户角色),他们会使用连接表

我认为联接更具可读性。使用联接可以使您的角色系统更灵活


如果您要求用户只能拥有一个角色,我会将该逻辑放在您的模型中。

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

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

对不起,我无能为力,但您编写的代码需要重构。>>def master?>>>>1==self.user\u type>>end与您所编写的相同,但效率很高。(啊!没有办法在SO中格式化注释内的代码。代码中的'>'表示缩进。)仅供参考:Do self.user_type==1。这将返回一个布尔值,这样您就不必通过if测试手动返回布尔值。对不起,我无法帮助您,但您编写的代码需要重构。>>def master?>>>>>1==self.user_type>>end与您编写的相同,但效率很高。(啊!没有办法在SO中格式化注释内的代码。代码中的'>'表示缩进。)仅供参考:Do self.user_type==1。这将返回一个布尔值,因此您不必通过if测试手动返回布尔值。由于您使用的是Rails,我假设您可能使用的是MySQL。据我所知,MySQL不支持位图索引。因此,如果您希望查找具有给定标志的所有用户,则可以从以下用户执行类似SELECT*的查询:RE(flags&1=1),它将不使用索引并执行完整的表扫描。由于您使用的是Rails,我假设您可能使用的是MySQL。据我所知,MySQL不支持位图索引。因此,如果您希望查找具有给定标志的所有用户,则可以从(flags&1=1)的用户中执行类似SELECT*的查询它将不使用索引并执行完整表扫描。
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