Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails迁移-将列从varchar更改为jsonb_Ruby On Rails_Json_Postgresql_Rails Activerecord - Fatal编程技术网

Ruby on rails Rails迁移-将列从varchar更改为jsonb

Ruby on rails Rails迁移-将列从varchar更改为jsonb,ruby-on-rails,json,postgresql,rails-activerecord,Ruby On Rails,Json,Postgresql,Rails Activerecord,我正在尝试将varchar类型的现有列转换为jsonb。该列包含类似“黑白橙色”的字符串,并希望将其转换为jsonb格式,以便将其转换为[“黑色”、“白色”、“橙色”] class AlterColorsDatatype

我正在尝试将varchar类型的现有列转换为jsonb。该列包含类似“黑白橙色”的字符串,并希望将其转换为jsonb格式,以便将其转换为[“黑色”、“白色”、“橙色”]

class AlterColorsDatatype
我希望这样可以将列类型转换为jsonb,而using:部分也可以将现有数据转换为jsonb

相反,我得到了以下错误:

ActiveRecord::StatementInvalid:PG::InvalidTextRepresentation:错误:json类型的输入语法无效 详细信息:标记“Indigo”无效。 上下文:JSON数据,第1行:Indigo :ALTER TABLE“quotes”ALTER COLUMN“colors”TYPE jsonb USING colors::jsonb


我尝试过其他语法,但最终还是出现了相同的错误。我想我必须用类似于to_json的东西逐个转换整个列的属性,但不确定如何解决这个错误。在多次谷歌搜索之后,其他出现相同错误的人似乎没有找到解决方案。

你无法通过简单的强制转换将空格分隔的字符串转换为JSON。一种简单的方法是首先将字符串拆分以获得PostgreSQL数组(
text[]
):

然后将该数组转换为JSON:

to_json(regexp_split_to_array(colors, E'\\s+'))
您必须小心引用和反斜杠,才能通过Ruby获得SQL并将其输入数据库,因此您可以说:

using: %q{to_json(regexp_split_to_array(colors, E'\\\\s+'))}
%q{…}
类似于单引号字符串,但可以避免在SQL字符串文本中转义单引号,然后将反斜杠加倍,以防止它们被
%q{…}
解释

to_json(regexp_split_to_array(colors, E'\\s+'))
using: %q{to_json(regexp_split_to_array(colors, E'\\\\s+'))}