Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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 RubyonRails中的多用户角色_Ruby On Rails_Ruby_Authentication_Roles - Fatal编程技术网

Ruby on rails RubyonRails中的多用户角色

Ruby on rails RubyonRails中的多用户角色,ruby-on-rails,ruby,authentication,roles,Ruby On Rails,Ruby,Authentication,Roles,我正在构建一个具有四种不同用户类型的库存管理应用程序:管理员、员工、制造商、运输商。我还没有开始编码,但这就是我的想法。。制造商和运输商通过与以下产品的多对多关联与has_多相关: class Manufacturer < ActiveRecord::Base has_many :products has_many :transporters, :through => :products end class Product < ActiveRecord::Base be

我正在构建一个具有四种不同用户类型的库存管理应用程序:管理员、员工、制造商、运输商。我还没有开始编码,但这就是我的想法。。制造商和运输商通过与以下产品的多对多关联与has_多相关:

class Manufacturer < ActiveRecord::Base
 has_many :products
 has_many :transporters, :through => :products
end

class Product < ActiveRecord::Base
 belongs_to :manufacturer
 belongs_to :transporter
end

class Transporter < ActiveRecord::Base
 has_many :products
 has_many :manufacturers, :through => :products
end
类制造商:产品
结束
类产品:产品
结束
所有四种用户类型都可以登录,但它们将具有不同的权限和视图等。但是,我不认为我可以将它们放在同一个表中(用户),因为它们有不同的要求,即:供应商和制造商必须有账单地址和联系信息(通过验证),但是管理员和员工不应该有这些字段

如果可能的话,我希望有一个单一的登录屏幕,而不是4个不同的屏幕


我并不是在要求确切的代码来构建它,但我很难确定实现它的最佳方式。任何想法都将不胜感激-谢谢

我建议您创建一个用户模型、地址模型、联系人信息模型等。您不应该在用户模型中包含此类字段。规范化数据库。在User.id的其他每个类中都有一个FK


如果您必须将它们分开,那么请规范化登录并使其多态以引用其所有者(制造商、员工等)

您的基本方法似乎是合理的。我建议您创建一个用户基类,并对特定的用户类型使用STI,例如:

class User < ActiveRecord::Base
end

class Manufacturer < User
 has_many :products
 has_many :transporters, :through => :products
end
class用户:产品
结束
……等等。通过这种方式,如果需要将多个用户类型聚合到一个关系中,而不考虑其类型,则可以使用一个表来描述用户。这是一种相当常见的方法


根据不同用户对系统的访问权限,您可能希望查看类似于gem的角色管理

对于多用户系统,通常首选的方法是-使用角色模型或STI。若您的用户可以同时拥有多个角色,比如单个用户是制造商和运输商,那个么基于角色的系统将是一个很好的解决方案。如果用户角色是固定的,那么我认为您应该使用STI

谢谢你的帮助!如何为此设置数据库表,为特定的用户类型使用User和STI基类?我对rails非常非常陌生:)数据库中只有一个“users”表。STI/单表继承使用基表中的“type”字段(在本例中为“users”)来区分基类的子类型。您需要在迁移中添加此字段。然后,基类的所有子类型的所有属性都将保留在users表中,即使其中许多属性不会被特定实例/行使用。这是使用STI模式的一个折衷方案——根据子类型特定属性的数量,您可能会有许多未使用属性的空字段。Weeelll…可能。拥有一个地址表当然是正常化的,但在现实世界中,很多时候这太过分了,事实上,即使是最顽固的规范化怪胎也会承认,像地址这样的东西——在大多数情况下,它只不过是一个varchar字段——不需要在产生所有开销的情况下规范化到它自己的表中。你真的想要一个SQL加入命中永久用户查询吗?对于这样一个简单的操作来说,性能不是很好。这在很大程度上取决于域名,以及地址是否真正复杂和可重用,等等。@davesims-I完全不同意。在当今世界,我们需要尽可能多的信息。规范化(特别是地址)允许将来扩展-我们可以允许用户拥有多个地址(例如家庭和工作地址)。而且,无论SELECT*返回10列还是JOIN返回10列,这都无关紧要(就像对于非常大的数据集来说,开销实际上是微不足道的)。此外,您不会总是与用户一起显示地址,那么为什么要将其显示在用户表中呢?这是一个单独的object@Dave西姆斯-(反对)。我是这样看的。我有名字,我有姓。我还有一个地址。我没有地址线1和地址线2,zip…,一个地址有地址线1,2…zip等等。对我来说,把这些东西分开是更有意义的。你能有一个没有地址的用户吗?如果有人无家可归,你真的想限制访问你的网站吗?我说得太过分了,但我想你会明白为什么规范化很重要。@seth.vargo:这是对规范化众所周知的好处的一个很好的陈述,但你也必须承认,这些好处所付出的代价可能并不适用于每一个应用程序。过度规范化可能是早期优化的一种情况。在《今日世界》中,我们已经看到,对于每一位相关数据都有一个fk,这既是一种责任,也是一种好处。Mongo等框架的兴起表明,对于许多应用程序和域来说,规范化不是主要关注的问题,性能是,数据可以用简单的树结构而不是复杂的关系结构来表示。@seth.vargo:至于你关于连接性能的断言——嗯,您是否确实需要优化现实世界中的生产查询?优化的首要规则之一是限制您加入的表的数量(如果可能),我向您保证,在“当今世界”中,这绝不是一个无关紧要的问题。至于你那可怜的无家可归的家伙,老兄,我不知道这有什么关系。您可以有必填/非必填字段或必填字段