最近、Rails アプリで結合テーブルの重複エントリに関連する問題を発見しました。このアプリは教育用で、学生用と演習用のモデルが含まれています。結合テーブルは、どの演習がどの生徒に割り当てられたかを追跡します。生徒に演習を 2 回以上割り当てることは意味がありません (つまり、結合テーブルに重複するエントリは許可されません)。
結合テーブルに一意性の検証を追加することで、問題を部分的に修正しました (以下のコードの最後の行を参照)。この検証により、今後新しい重複エントリが作成されるのを防ぐことができます。ただし、テーブル内の既存の重複に対処するという問題にまだ直面しています。
有効でなくなったすべてのレコードを取得するために、既存のデータベース全体に対して新しい検証を実行する方法はありますか?
class Student < ActiveRecord::Base
has_many :student_exercise_assignments
has_many :exercises, :through => :student_exercise_assignments
end
class Exercise < ActiveRecord::Base
has_many :student_exercise_assignments
has_many :students, :through => :student_exercise_assignments
end
class StudentExerciseAssignment < ActiveRecord::Base
belongs_to :student
belongs_to :exercise
validates :exercise_id, :uniqueness => { :scope => :student_id, :message => "An exercise can only be assigned to a student once" }
アップデート
以下の塩山の回答は、まさに私が探していた情報を提供します。しかし、Rails の初心者である私は、彼の&
inの使い方に少し戸惑いました&:invalid?
。&
Rubyの演算子の入門書が必要な場合は、ここに良いものがあります。