【问题标题】:How to delete only the objects from ActiveRecord collection from mysql in Rails?如何从 Rails 中的 mysql 中仅删除 ActiveRecord 集合中的对象?
【发布时间】:2016-11-16 18:40:51
【问题描述】:

我正在使用我创建的服务对象计算游戏玩家的每周排行榜统计数据。我的情况是,如果我想重做任何特定周的计算,我想删除旧的统计数据,当且仅当新的统计数据保存成功。

大概是我的步骤:

  1. AR 将给定周的现有统计信息查询到变量中
  2. 运行该周的新统计数据
  3. 保存新数据,如果保存成功则返回
  4. 成功保存新数据后,从步骤 1 中查询的 mysql 中删除对象。

我已经尝试使用@old_data.delete_all 方法,但此时只会从 mysql 的 ActiveRecord_Relation 对象运行查询,同时也会破坏新创建的数据。我只想销毁在创建新数据之前从查询中保存的那些。

可能的解决方案我没有尝试过:Sorta hacky,但是通过使用任意值更新旧数据查询中所有对象的任意列来标记旧数据,并使用查询中的delete_all 来获取该任意值.. . 这听起来不像是轨道式的做事方式,而且,它增加了一个额外的查询。

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-4 activerecord


    【解决方案1】:

    您可以简单地 pluck 旧行的 ID,而不是添加标志,然后运行新查询删除这些行。 delete_all 方法根据定义运行一个新查询,因此无法冻结旧结果并直接删除它们。

    如果许多字段(例如 player_idgame_id 或其他)每周都相同,您也可以尝试直接更新行...

    【讨论】:

    • 我真的明白答案是多么简单,我在你回答的那一刻就回去发布它!计时器到期后,我会立即将您的标记为正确。谢谢!
    【解决方案2】:

    我可以从旧数据的 ActiveRecord 查询中提取 id。然后使用 delete_all 关闭这些 ID

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多