【问题标题】:How to update a column of type array with postgresql and ruby on rails如何使用 postgresql 和 ruby​​ on rails 更新数组类型的列
【发布时间】:2017-09-25 05:42:42
【问题描述】:

我有一列用于使用以下 ruby​​ on rails 迁移创建的表

def change    
    add_column :matches, :st_history, :smallint, array: true, default: []
end

在 postresql 数据库上。我希望将列的所有值重置为默认值。我试过了

Match.update_all(st_history: [])

但这不会改变任何字段。查看api documentation,它指出“它应该只接收可以按原样传递给SQL 数据库的值”,所以我怀疑该数组是一种复杂的数据类型,不能与简单的update_all 命令一起使用。数据库有数百万行,所以我不想单独更新每一行。有什么快速的方法?

【问题讨论】:

  • 我相信它有效。你重新加载你的模型并检查了吗?
  • 告诉我我提供的答案是否有帮助
  • EJ2015,你是对的,我只是忘了重新加载。你想把这个作为答案,我会接受。因为有人已经回答了,所以删除问题为时已晚。

标签: ruby-on-rails postgresql


【解决方案1】:

这确实有效。只需要重新加载。

【讨论】:

  • 事实证明,虽然这可行,但在我的数据库上使用需要 80 个小时,所以我最终使用了 Aniket 的答案,只花了几秒钟。
  • 只是好奇,你的数据库有多大? update_all 向 db 发送一条 SQL 命令,完全跳过 ActiveRecord。为什么要花那么长时间?
【解决方案2】:

您可以通过创建迁移来尝试。并且可以提供默认值

update_column :table_name, :col_name, :integer, array: true, null: false, default '{}'

【讨论】:

  • Aniket,它应该是 'change_column' 而不是 'update_column'。对于大型数据库,这种方法很神奇。在我的数据库上,我原来的方法只需要几秒钟而不是 80 小时。
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 2017-06-26
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多