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
Ruby on rails 如何扩展模型类?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 如何扩展模型类?

Ruby on rails 如何扩展模型类?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有两种类型的用户(普通用户、超级用户)。使用附加表扩展一个基本用户类的正确方法是什么 我在想这样的事情,但我不确定我会走正确的方向: class User < ActiveRecord::Base end class SuperUser < User end class RegularUser < User end class用户

我有两种类型的用户(普通用户、超级用户)。使用附加表扩展一个基本用户类的正确方法是什么

我在想这样的事情,但我不确定我会走正确的方向:

class User < ActiveRecord::Base
end

class SuperUser < User
end

class RegularUser < User
end
class用户

在Rails中这是正确的方法吗?谢谢:)

这是100%正确的方法,但您需要记住,所有模型都将存储在数据库的一个表中。这种方法称为STI(单表继承),在您的模型中只需要一个附加字段
type

这是100%正确的方法,但您需要记住,所有模型都将存储在数据库的一个表中。这种方法称为STI(单表继承),在您的模型中只需要一个附加字段
type

如果您想拥有不同类型的用户,我会选择用户角色而不是不同的用户表等

CanCan是一个非常好的宝石,其文档非常优秀:


你也会有很好的帮手,可以吗?或者,不能?还有更多

如果你想拥有不同类型的用户,我会选择用户角色和不同的用户表等

CanCan是一个非常好的宝石,其文档非常优秀:


你也会有很好的帮手,可以吗?或者,不能?还有更多

是的,您还应该使用单表继承。这意味着您应该在用户模型中添加一个名为“type”的列。Rails识别列“type”并对其进行特殊处理。本质上,类型模型中的所有条目都将引用另一个模型。在该模型中,可以为每种类型定义规则。验证您的用户模型,以便只输入您想要的两种类型也是一个好主意。这应该起作用:

class User < ActiveRecord::Base
    validates :type, :inclusion => {:in => ['SuperUser', 'RegularUser']}
end
class用户{:in=>['SuperUser','RegularUser']}
终止

是的,您还应该使用单表继承。这意味着您应该在用户模型中添加一个名为“type”的列。Rails识别列“type”并对其进行特殊处理。本质上,类型模型中的所有条目都将引用另一个模型。在该模型中,可以为每种类型定义规则。验证您的用户模型,以便只输入您想要的两种类型也是一个好主意。这应该起作用:

class User < ActiveRecord::Base
    validates :type, :inclusion => {:in => ['SuperUser', 'RegularUser']}
end
class用户{:in=>['SuperUser','RegularUser']}
终止

@bjhaid-它叫STI,多态关联是另外一回事儿。@bjhaid-它叫STI,多态关联是另外一回事儿儿儿。谢谢。我已经建立了自己的授权系统:)我可以这样做,但我会再次为不同的用户提供多个不同的表列。若超级用户有额外的2列,那个么普通用户也会有这些列,但它们将为null。或者我错了?这将是一个额外的表“角色”,用户可以属于某些角色。没有“未使用”的列。这是一种非常干净的方法,在任何情况下都应该避免使用两个不同的用户表(如果普通用户成为管理员怎么办?)。另一个非常简单的方法是创建一个名为_admin的列,该列可以是true,也可以是false。不过我会选择角色制。它更灵活,因为您可以随时间添加多个角色。如果一个用户不是真正的管理员,但被允许执行“一些”管理员任务,该怎么办?可能是一个“编辑”角色或类似的角色,我在考虑这个问题,但我认为在我的案例中会有一些未使用的字段。假设我有三种用户类型(管理员、教授、学生)。管理员只需要以下列:用户名、姓、名。教授需要额外的栏目,所以他有:用户名,姓氏,名字,班级数,薪水。学生不需要这些字段,但需要一些其他字段,所以他有:用户名、姓、名、平均成绩、通过的课程数。如果只有一个表“roles”,我不是会有一个大的用户表,其中有许多未使用的列吗?例如,prof.You的average_grad会有工资和课程等表格(最好选择不同的名称,以避免与保留关键字的课程发生冲突)。然后将“has_one:salary”和“has_many:classes”设置为用户模型。现在,您可以查询User.first.classes并获取她/他的类或什么都没有(如果是学生)等。这就是所谓的规范化,您将没有空字段,只有在某些表中没有数据的用户。我将执行Salary class(有id、User_id(它所属)和amount。然后是Klass类(不要与关键字冲突-找到不同的名称)。在Klass和User之间,我会设置一个多对多关系。这里是所有这些场景的优秀指南:谢谢。我已经建立了自己的授权系统:)我可以这样做,但我会再次为不同的用户提供多个不同的表列。如果超级用户有额外的2列,普通用户也会有这些列,但它们将为空。或者我错了?这将是一个额外的表“角色”,用户可以属于某些角色。不会有“未使用的”这是一种非常干净的方法,在任何情况下都应该避免使用两个不同的用户表(如果一个普通用户成为管理员怎么办?)。另一个非常简单的方法是创建一个名为“is_admin”的列,该列的值可以是真的,也可以是假的。不过,我会选择角色系统。它更灵活,因为随着时间的推移,您可以添加多个角色。用户不是真正的管理员,但可以执行“一些”管理员任务。可以是“编辑器”角色或类似的角色我在考虑这个问题,但我认为在我的例子中会有一些未使用的字段。所以,假设我有三种用户类型(管理员、教授、学生)。管理员只需要这些列:用户名、姓氏、名。教授