检查两列之间的属性是否唯一

时间:2016-01-24 22:04:08

标签: ruby-on-rails activerecord rails-activerecord

我的Classroom模型有两个属性,student_classcodeteacher_classcode。我有一个after_create回调来在创建教室后生成这两个代码。目前,我只用这个生成student_classcode:

(摘自here

class Classroom < ActiveRecord::Base

  after_create :generate_token

  private

    MAX_RETRIES = 10
    def generate_token
      update_column :student_classcode, SecureRandom.hex(4)
    rescue ActiveRecord::RecordNotUnique => e
      @token_attempts = @token_attempts.to_i + 1
      retry if @token_attempts < MAX_RETRIES
      raise e, "Retries exhausted"
    end

end

现在它确保student_classcode是唯一的(最多10次重试)。我希望能够生成teacher_classcode,并且我希望确保它在teacher_classcode student_classcode列中是唯一的。

因此,例如,如果课堂A具有student_classcode'12345',并且(偶然)课堂B的teacher_classcode生成为'12345',我希望课堂B重新生成类代码。或者,如果课堂B有student_classcode'abcde',而课堂B有teacher_classcode'abcde',那么我希望课堂B重新生成teacher_classcode

我知道两个列中存在两个相同类代码的可能性很小,但我不想冒险。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

为什么不将Classcode本身设为模型,并使用验证来确保代码是唯一的。然后生成通用代码,并通过belongs_to中的标准Classroom关联,您可以将教师与学生的类代码相关联。

通过这种方式,您可以确保每个类代码都是唯一的,并且只有一个代码生成实现。