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

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

我在使用 Postgresql 的 Ruby on Rails 4 中工作,但遇到了一些障碍。我们有一个名为 AttendanceRecord 的 Active Record 模型,它属于 AttendanceDayAttendanceSwipeCourse类(class)时间段。考勤记录本应在这些字段上是唯一的,但出了点问题,重复项偷偷溜进来。所以,我写了一个方法来查找所有重复的考勤记录,只保留其中一个。

在该方法的过程中,我构建了共享相同属性的对象的 Active Record 关系,如下所示:

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 并愉快地开展我的业务。 :)

最佳答案

如果你想从关系中排除一个对象,你可以通过 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 记录的记录上调用。

关于sql - 从 Active Record Relation 中移除对象而不删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26106398/

相关文章:

mysql - 如何使用 FULLINDEX 对 MySQL 中的两个或更多列进行 MATCH AGAINST?

mysql - Rails 中的多个数据库连接

sql - Rails 中的 HABTM 关联 : collecting and counting the categories of a model's children

ruby-on-rails - 使用包含/连接

MySQL用于统计用户有多少个前10名的分数

mysql - 尝试使用加载数据本地文件 SQL 导入 csv 文件并转换为整数

SQL 排除查询

ruby-on-rails - Rails - 使用 ransack 通过链接查询数据库

ruby-on-rails - 在 Windows 7 中安装 Ruby on Rails

ruby-on-rails - 如何在 Rails 和 Postgresql 中查找带有多个标签的帖子