如何查找未通过新验证的旧记录?

dB'*_*dB' 4 ruby-on-rails

我最近在Rails应用程序中发现了与连接表中的重复条目相关的问题.该应用程序是教育性的,包括学生和练习模型.连接表记录了哪些学生分配了哪些练习.将练习多次分配给学生是没有意义的(即不应允许在连接表中重复的条目).

我通过在连接表中添加唯一性验证来部分修复问题(参见下面的最后一行代码).此验证将防止将来创建任何新的重复条目.但是,我仍然面临着解决表中现有重复项的问题.

有没有办法对整个现有数据库运行新验证,以检索不再有效的所有记录?

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" }
Run Code Online (Sandbox Code Playgroud)

UPDATE

Shioyama在下面的回答给出了我正在寻找的信息.作为一个Rails的新手,虽然我有点被他利用的困惑&&:invalid?.如果有人需要&Ruby 中的运算符的引子,那么这里有一个很好的.

Chr*_*erg 8

怎么样:

invalid_assignments = StudentExerciseAssignment.select(&:invalid?)
Run Code Online (Sandbox Code Playgroud)

这将选择在使用该invalid?方法调用时返回true的所有赋值.然后,您可以执行任何操作来修复它们.

作为旁注,我还建议为数据库添加唯一性约束.请参阅此答案以了解原因:Rails:模型与迁移中的验证