5

我最近在一个 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" }

更新

Shioyama 在下面的回答正是我正在寻找的信息。&不过,作为 Rails 新手,我对他使用in有点困惑&:invalid?。如果有人需要 Ruby 中的运算符入门,这里&有一本很好的。

4

1 回答 1

10

怎么样:

invalid_assignments = StudentExerciseAssignment.select(&:invalid?)

invalid?这将选择使用该方法调用时返回 true 的所有分配。然后,您可以做任何您需要做的事情来修复它们。

作为旁注,我还建议向您的数据库添加唯一性约束。请参阅此答案以了解原因:Rails: Validation in model vs migration

于 2013-01-27T13:03:17.963 回答