【问题标题】:In Rails, how to add an element to an array type attribute for all records?在 Rails 中,如何将元素添加到所有记录的数组类型属性中?
【发布时间】:2014-06-16 04:58:34
【问题描述】:

数据库是 PostgreSQL。如何将所有记录的值附加到具有数组数据类型的列?

例如:

# migration_file.rb

def change
  add_column :users, :tags, :string, array: true, default: []
end

如何将相同的值附加到所有用户记录的tags 属性?我想做类似的事情:

User.update_all(tags << "some_tag")

【问题讨论】:

  • 试试这个User.update_all(tags &lt;&lt; ['some_tag'])

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


【解决方案1】:

您可以将 SQL sn-p 传递给update_all,这样您就可以使用所有常用的PostgreSQL array operators。例如:

User.update_all(['tags = tags || ?::text', 'some_tag'])

或没有|| 歧义(和相应的演员表):

User.update_all(['tags = array_append(tags, ?)', 'some_tag'])
User.update_all(['tags = tags || array[?]', 'some_tag'])

请注意,在这种情况下,您将传递 update_all 一个数组,您需要这样做以使 AR 相信您希望 'some_tag' 填充占位符而不是 WHERE 子句。

【讨论】:

  • 这很有意义,不幸的是我遇到了ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: array value must start with "{" or dimension information. 错误可能与手头的问题无关;我会继续挖掘。
  • 这是哪个版本的 PostgreSQL?你能从psqlupdate users set tags = tags || 'some_tag' 吗?
  • 不,我不能在psql,即使从 9.2.2 升级到 9.3.4。对于我的迁移文件,我将default: [] 更改为default: '{}',但也没有运气。
  • 好的,这似乎是有效的:update users set tags = tags || '{some_value}'。我会再修改一下,但这似乎是正确的语法。
  • 数组有两种|| 形式:array || elementarray || array。我猜 PostgreSQL 正在选择 array || array 形式并尝试将字符串解释为字符串格式的数组(即它期望 {some_value}array['some_value'] 相同。如果添加显式cast(如我更新的答案)那么它应该选择正确版本的 || operator。或者,您可以使用 array_append 并避免歧义。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多