5

最近、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の演算子の入門書が必要な場合は、ここに良いものがあります。

4

1 に答える 1

10

ちょうどどうですか:

invalid_assignments = StudentExerciseAssignment.select(&:invalid?)

invalid?これにより、メソッドで呼び出されたときにtrueを返すすべての割り当てが選択されます。その後、それらを修正するために必要なことは何でもできます。

補足として、データベースに一意性制約を追加することもお勧めします。理由については、この回答を参照してください。Rails:モデルと移行の検証

于 2013-01-27T13:03:17.963 に答える