我最近在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 中的运算符的引子,那么这里有一个很好的.
怎么样:
invalid_assignments = StudentExerciseAssignment.select(&:invalid?)
Run Code Online (Sandbox Code Playgroud)
这将选择在使用该invalid?方法调用时返回true的所有赋值.然后,您可以执行任何操作来修复它们.
作为旁注,我还建议为数据库添加唯一性约束.请参阅此答案以了解原因:Rails:模型与迁移中的验证
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |