Rails将现有文本列更改为数组

时间:2017-05-03 07:27:23

标签: ruby-on-rails postgresql

使用Postgres数据库,在staff_ids表中添加了一个文本字段branches

add_column :branches, :staff_ids, :text

在控制器中将此字段添加到branch_params列表:

:staff_ids => []

数据已保存在此列中,如["","32","52"]。在查询这个字段时,我收到一个错误,说staff_ids应该是一个数组

Branch.where("? = ANY(staff_ids)", '20')

ActiveRecord::StatementInvalid: PG::WrongObjectType: ERROR:  op ANY/ALL (array) requires array on right side

实际上,我在添加array: true字段时忘记在迁移中添加staff_ids选项。 现在添加了另一个迁移以更改此列,并尝试添加array: true选项:

change_column :branches, :staff_ids, :text, array: true

但迁移失败并出现错误:

PG::DatatypeMismatch: ERROR:  column "staff_ids" cannot be cast automatically to type text[]

现在我要更新where子句,以便根据staff_ids过滤分支而不添加数组:true或修复上面提到的迁移。

有任何建议/想法吗?

1 个答案:

答案 0 :(得分:0)

您可以在迁移中添加以下内容,

def up
    change_column :branches, :staff_ids, :text, array: true, default: [], using: "(string_to_array(staff_ids, ','))"
end

def down
    change_column :branches, :staff_ids, :text, array: false, default: nil, using: "(array_to_string(staff_ids, ','))"
end

如果不需要更改数组,定义向上和向下方法将有助于在任何时候撤消迁移。