1

has_many 関連付けの一意性を検証するアイデアがありました。関連付けられたレコードの ID に基づいて文字列を生成するとどうなるでしょうか?

例えば:

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「チェックサム」が正しい用語かどうかはわかりません。)

4

1 に答える 1

0

以下に基づいてください。

  1. あなたはExamモデルとモデルをProblem持っています
  2. 毎秒Exam has_many Problem_
  3. 各問題は固有でなければなりませんExam

uniquenessの属性に検証を配置することはより理にかなっていると思いますProblemが、検証の範囲をその属性に限定しExamて、複数Examsが同じProblems を持つことができますが、それぞれExamが一意のProblems のセットを持つようにします。

したがって、たとえば、という名前の属性があった場合、その属性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
于 2013-08-22T22:50:28.553 に答える