2013-08-22 86 views
1

我有一个想法来验证has_many关联的唯一性:如果我们根据关联记录的id生成一个字符串,该怎么办?用字符串“校验和”验证has_many关联的唯一性

例如:

class Exam 
    has_many :problems #problems are unique and can be in multiple exams 

    validate :checksum, uniqueness: true #string 

    before_validate :check 
    def check 
    checksum = problems.map {|p| p.id}.join 
    end 
end 

我们要解决的边缘情况是: 鉴于不同的问题3x4sqrt(4)5+5等..,我们不希望他们都处于不止一次考试。

有没有人有这种方法的想法?有没有更好的方法来验证has_many的唯一性?

(PS我不知道,如果 “检验” 是正确的术语)。

+0

您能否提供更多关于此上下文的信息?为什么你需要has_many关联是唯一的?我可以想象,如果它是一个'has_many'(而不是has_and_belongs_to_many),那么没有两个考试会有相同的'问题'。 – Olives

+0

@Olives你是对的:澄清,问题是独特的,可以在多个考试中。例如,'sqrt(4)='是唯一的,可用于多个考试。 –

回答

0

基地在以下方面:

  1. 你有一个Exam模型和Problem模型
  2. 每个Examhas_manyProblem s
  3. 每个问题必须是唯一的每个Exam

我觉得它更有意义的地方一个uniqueness验证上的ProblemExam,使多个Exams可以有相同的Problem秒的属性,但范围的验证,但每个Exam都有一套独特的Problem秒。

因此,例如,如果有一个名为value的属性,我们会对其进行唯一性验证并将其范围限定为exam_id

class Exam < ActiveRecord::Base 
    has_many :problems 
end 

class Problem < ActiveRecord::Base 
    belongs_to :exam 

    validates :value, :uniqueness => { :scope => :exam_id } 
end 
+0

我喜欢这种方法,但它不能验证两个考试具有相同问题'1 + 2 =''2 + 2 ='等的情况。 –