【问题标题】:Update many records from an array更新数组中的许多记录
【发布时间】:2019-07-26 16:42:38
【问题描述】:

我正在尝试使用类方法来更新我已修改并存储在数组中的许多记录;我拼凑了一种方法来做到这一点,但它看起来很老套,并且使用我阅读的更新方法已被贬值。

def big_update
  items = Table.all
  saves=[]

  items.each do |item|
    item.value = rand(10)
    saves << item.as_json
  end

  saves = Hash[*saves.map{ |p| [p["id"], p] }.flatten]
  self.update(saves.keys, saves.values)
end

关键是我希望只访问数据库一次以保存所有这些,而不是每次迭代都访问它。

我正在寻找一种更优雅的方式来做到这一点,所以任何建议都将不胜感激

【问题讨论】:

  • 您是否尝试将 value 列设置为 0 到 9(含)之间的随机数,而忽略其他所有内容?
  • @muistooshort 对于所有意图和目的,是的。实际上,我是从电子表格中获取值,对其进行转换,然后使用结果来更新表格,但我认为这个示例案例会更容易阅读。
  • 如果您已经在内存中有数据(即您已经解析了一些电子表格),那么您所拥有的几乎就是它的样子。如果数据已经在数据库中,那么您可以执行一次 SQL 更新并使用数据库的 randrandom 函数。您还可以将电子表格转换为 CSV,使用数据库的 CSV 导入工具导入 CSV,然后执行 UPDATE 设置随机数。所以取决于你有多少数据以及它在哪里。希望这一点帮助。

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


【解决方案1】:

我不确定您的操作是否有其他细微差别,但如果您只想将 value 字段更新为类中的随机数,您可以这样做:

def big_update
  Table.all.each do |table|
    table.update(value: rand(10))
  end
end

【讨论】:

  • 这基本上可以工作,关键目标(我在看到你的答案后添加到我的问题中)是我不想在每次迭代时都访问数据库以考虑性能。
  • @neanderslob 在这种情况下,您所拥有的本质上是该类型查询的最佳 AR 实现。他们在名为#upsert_all 的方法中为Rails 6 添加了新功能,这很可能是您正在寻找的功能。如果您在 Rails 6 上并希望我使用该解决方案编辑我的答案,请随时告诉我。
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2016-03-24
  • 2013-09-30
  • 2017-08-07
相关资源
最近更新 更多