设计中的多个模型的集中用户ID跟踪

时间:2016-12-15 08:16:09

标签: ruby-on-rails authentication devise ruby-on-rails-5

我为不同的用户类型使用不同的模型。

假设有两个模型,StudentTeacher 每个模型都有一个ID字段,分别为student_idteacher_id

这两个ID字段都以1开头,并且彼此不相关。

因此,第一位教师和第一位学生将拥有相同的ID,student_id将是1teacher_id将是1

现在我想修改设计,如果用户的ID为1,那么之后创建的教师应该考虑它并且ID为2(而不是1)

这有助于分别识别每个用户(任何类型),因为没有两个ID是相同的。

或者有没有其他方法来获得结果而不是配置设计?

1 个答案:

答案 0 :(得分:0)

我只使用一种型号,例如用户。

除了所有用户资料(姓名,电子邮件等)之外,我还会添加枚举类型,例如user_type:

-=

你的移民应该看起来像这样的例子:

enum user_type: [ :teacher, :student ]

使用枚举类型,您可以找到def change create_table :users do |t| t.string :email, null: false t.string :first_name t.string :last_name t.string :password_digest, null: false t.integer :user_type, null: false t.timestamps null: false end end 的教师和users.teacher.all的学生。

所有用户都存储在同一个表中,如果需要,您可以添加更多user_types。

在您的数据库中,所有教师的user_type列中都有一个0,学生将有一个1.

如果您添加更多user_types,例如来宾,您的模型就像

users.student.all

并且所有访客在user_type列中都有2,依此类推。

rails api

中介绍了有关模型中枚举的更多信息

编辑:

如果你真的想要使用两种不同的模型,你必须编写自己的方法。

非常简化:

enum user_type: [ :teacher, :student, :guest ]

在两个模型中包含此方法(可能您想使用问题)并在创建记录时使用next_id:

def next_id
  Student.last.id > Teacher.last.id ? Student.last.id + 1 : Teacher.last.id +1
end

在我看来,第二种方式似乎很尴尬。我总是喜欢枚举的例子。