从Active Record Relation中删除对象而不删除它

时间:2014-09-29 18:25:31

标签: sql ruby-on-rails activerecord ruby-on-rails-4 relational-database

我正在使用Postgresql在Ruby on Rails 4上工作,而且我遇到了一些麻烦。我们有一个名为AttendanceRecord的Active Record模型,它属于AttendanceDayAttendanceSwipeCourseCourseTimeSlot。出勤记录在这些领域应该是独一无二的,但是出了问题,重复出现了。所以,我写了一个方法来查找所有重复的出勤记录,只保留其中一个。

在该方法的过程中,我构建了一个共享相同属性的对象的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并愉快地开展业务。 :)

1 个答案:

答案 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记录的记录进行调用。