我正在使用Postgresql在Ruby on Rails 4上工作,而且我遇到了一些麻烦。我们有一个名为AttendanceRecord
的Active Record模型,它属于AttendanceDay
,AttendanceSwipe
,Course
和CourseTimeSlot
。出勤记录在这些领域应该是独一无二的,但是出了问题,重复出现了。所以,我写了一个方法来查找所有重复的出勤记录,只保留其中一个。
在该方法的过程中,我构建了一个共享相同属性的对象的Active Record Relation,如下所示:
records = AttendanceRecord.where(course_id: attributes[0], course_time_slot_id: attributes[1], attendance_swipe_id: attributes[2], attendance_day_id: attributes[3])
关系不错,对吧?
接下来,我找到了我想要保留的对象,并将其命名为to_keep
。然后,我试图从关系中删除该对象,如下所示:
records.delete(to_keep)
不幸的是,我发现delete
方法在关系上的工作方式与在数组上的工作方式略有不同。它不是简单地从列表中删除对象,而是从数据库中删除它(没有回调)。
所以:我想知道是否有一个我遗漏的方法会从Relation中删除我的to_keep
对象而不实际触及对象本身。然后,我将能够安全地致电records.destroy_all
并愉快地开展业务。 :)
答案 0 :(得分:5)
如果要从关系中排除对象,可以通过id执行此操作。例如:
records.where('id <> ?', to_keep.id).destroy_all
或者,感谢@trushkevich,在rails 4中你可以做到:
records.where.not(id: to_keep.id).destroy_all
这意味着destroy_all
将会对您已识别但已排除to_keep
记录的记录进行调用。