Rails迁移 - 将整数列更改为整数数组 - Postgres

5

我在提供者模型(Provider Model)中有一个benefit_type整数列,它是一个枚举(enum)列。

Provider.rb

enum: ['abc', 'bcd']

现在我想迁移到array_enum

Provider.rb

array_enum: {'abc': 0, 'bcd': 1}

因此,为了适应这种变化,我想将我的列更改为整数数组。在我的迁移中,我有以下内容:

change_column :providers, :benefit_type, :integer, array: true, default: {}, using: "(string_to_array(benefit_type, ','))"

错误:

 Caused by:
PG::UndefinedFunction: ERROR:  function string_to_array(integer, unknown) does not exist
LINE 1: ...ALTER COLUMN "benefit_type" TYPE integer[] USING (string_to_...
                                                         ^
HINT:  No function matches the given name and argument types. You might need to add explicit 
type casts.

也尝试过:

   change_column :providers, :benefit_type, :integer, array: true, default: []

错误:

 Caused by:
ActiveRecord::StatementInvalid: PG::DatatypeMismatch: ERROR:  column "benefit_type" cannot 
be cast automatically to type integer[]
HINT:  You might need to specify "USING benefit_type::integer[]".
: ALTER TABLE "providers" ALTER COLUMN "benefit_type" TYPE integer[], ALTER COLUMN 
"benefit_type" SET DEFAULT '{}'

我已经使用了这个 using: 'ARRAY[benefit_type]::INTEGER[]'。也许这可以解决你的问题。 - Pravesh Khatri
@PraveshKhatri 我遇到了这个 ActiveRecord::StatementInvalid 错误:PG::DatatypeMismatch: ERROR:无法将列“benefit_type”的默认值自动转换为整数数组类型。 - Suganya Selvarajan
我已经尝试过了,在我的环境中使用Rails 5.2,它可以正常工作。以下是完整的语法:change_column :providers, :benefit_type, :integer, array: true, default: [], using: 'ARRAY[benefit_type]::INTEGER[]' - Pravesh Khatri
@PraveshKhatri 请将您的评论添加为答案。我会接受它。这个方法可行 :) 我只需要删除我的旧默认值。 - Suganya Selvarajan
3个回答

7
你需要在using关键字中指定整数数组和列名。
change_column :providers, :benefit_type, :integer, array: true, default: [], using: 'ARRAY[benefit_type]::INTEGER[]'

我只需要删除我的旧默认值,这个解决方案就有效了。 - Suganya Selvarajan

2

首先,如果有默认列,请将其删除。然后,您需要指定一个整数数组,其中包含所需的列名,并在需要时设置默认值。

change_column_default :table_name, :column_name, from: default_value, to: [default_value]
change_column :providers, :benefit_type, :integer, array: true, default: [], using: 'ARRAY[benefit_type]::INTEGER[]'

3
你好,看起来你从同一线程中的另一个回答中复制了这个答案。未注明出处使用他人的作品属于抄袭,这在Stack Overflow上是不被欢迎的。请记得在使用其他来源时添加显著的引用。谢谢!顺便说一下,这个评论模板的来源在这里 :) - Ardent Coder
嗨,@ArdentCoder,今天我遇到了同样的问题,并通过删除列默认值来解决了上述问题。因此,我添加了描述文本,以便在已添加默认列的情况下删除列默认值。然后继续使用change_column。这是正确的方法。 - Ezhil
1
@ArdentCoder,非常抱歉这是我的第一个答案。我不知道该如何解释。现在我已经改变了我的解决方案。这样可以吗?这就是我今天在开发中修复的问题。 - Ezhil
没关系,我注意到你是新来的,没有标记或者踩你的回答。相反,我礼貌地与你沟通了这个问题,而且你已经纠正了错误。在我发表评论之前,没有人踩过你的回答,所以我给你点赞,让净投票数恢复原状,希望这能激励你继续贡献更多高质量的回答 :) - Ardent Coder

0

您可以使用此功能将现有的整数类型列转换为整数数组

change_column :providers, :benefit_type, 'integer[] USING ARRAY[benefit_type]::INTEGER[]', array: true, null: false, default: []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接