Ruby on rails 如何在RubyonRails中拥有唯一的学生id

Ruby on rails 如何在RubyonRails中拥有唯一的学生id,ruby-on-rails,ruby,database,indexing,database-design,Ruby On Rails,Ruby,Database,Indexing,Database Design,我有一个简单的学生模型,但我也希望每个学生都有唯一的学生代码,我知道我可以使用学生id,但我希望学生代码类似于“STU0001”、“STU0002”。我如何实现这样的东西,以便每当我创建一个student时,它都会创建student代码并将其添加到DB中? 在这种情况下,我如何通过学生的ID搜索学生?您可以在模型中使用创建挂钩之前进行搜索,例如- class Student < ActiveRecord::Base # Callbacks before_create :set_st

我有一个简单的学生模型,但我也希望每个学生都有唯一的学生代码,我知道我可以使用学生id,但我希望学生代码类似于“STU0001”、“STU0002”。我如何实现这样的东西,以便每当我创建一个student时,它都会创建student代码并将其添加到DB中?
在这种情况下,我如何通过学生的ID搜索学生?

您可以在模型中使用创建挂钩之前进行搜索,例如-

class Student < ActiveRecord::Base
  # Callbacks
  before_create :set_student_id

  def set_student_id
    self.student_id = "STU" + "%04d" % self.id
  end
end

如果您希望id前缀为
STU
只是为了便于显示,那么我建议不要以这种方式存储在数据库中。
让自动递增
id
的当前实现保持不变。
在显示时,您可以使用
STU

为了方便使用,您可以创建方法将此逻辑包装为

def formatted_id # OR friendly_id or whatever you like
  "STU#{'%04d' % self.id}"
end
不存储前缀id的原因:

  • 你必须写一个setter
  • 您的列数据类型将更改为字符串
  • 与整数列相比,您的性能将下降
  • 将来,如果您决定更改前缀,则必须更新现有ID。使用我的解决方案,您只需更改方法中的格式,即可随时更改所有(现有和未来)ID的格式
  • 搜索取决于您的用例是什么。如果你能解释一下,那么我可以更好地指导你。 要搜索学生,您可以在模型中编写一个方便的方法,如下所示(我假设它将是学生或用户)


    学生
    员工
    是否共享同一型号?如果是,请创建一个模型函数,在唯一id前面加上前缀
    STU000
    ,然后假设您想要自定义主键?还是希望学生id是另一个属性?为什么需要
    STU
    作为前缀?如果只是为了查看它的方式,您可以在视图中进行交互时使用默认的
    id
    ,只需预先添加
    STU
    。如果您真的希望在Rails中的数据库中有一个自定义主键,您可以在线查看如何做到这一点。例如,学生代码将如何使用?根据使用情况,这听起来可能是一个独特的坏主意。或者,它可能是辉煌的。如果没有额外的上下文,很难说。谢谢,但是我如何通过学生id搜索学生?要逐个学生id搜索,您必须使用一个小方法从学生id中提取id。我同意Anand的观点,将学生id存储在数据库中不是一个好主意。除了他给出的理由外,一个字段完全依赖另一个字段是不“规范化”的。@MozartLen我已经用搜索相关片段更新了答案。如果你能简单介绍一下你的用例是什么,那么我可以更好地帮助你。谢谢你提供这个解决方案,我想在创建学生时为他们分配一个学生id。我有一个“借出”模型,每当学生借出一本书时都会填写该模型,在该模型中我有学生id:references。我希望在创建借出记录时使用学生id引用学生。
    def formatted_id # OR friendly_id or whatever you like
      "STU#{'%04d' % self.id}"
    end
    
    def self.find_by_formatted_id(formatted_id)
      self.find(formatted_id.gsub(/^STU/, ''))
    end
    
    def self.find_by_formatted_ids(formatted_ids) # formatted_ids will be an array
      self.where(id: formatted_ids.map{ |fid| fid.gsub(/^STU/, '') })
    end