在我们的数据库中,我们目前有一个表,其中包含String country
列。这存储了单个国家代码(例如US
)。country
列有一个索引。我们现在需要在列中存储多个国家代码,因此我们想将其转换为PostgreSQL String数组。我目前的迁移代码是
def change
reversible do |direction|
change_table :product do |table|
direction.up do
table.remove_index(:country)
table.rename :country, :countries
table.change :countries, :string, array: true
table.index :countries
end
direction.down do
table.remove_index(:countries)
table.change :countries, :string, array: false
table.rename :countries, :country
table.index :country
end
end
end
end
然而,当我运行迁移时,我得到错误
PG::DatatypeMismatch: ERROR: column "countries" cannot be cast automatically to type character varying[]
HINT: You might need to specify "USING countries::character varying[]"
我不确定如何指定我希望如何执行转换。
我想知道如何更改迁移,以便
countries
列是一个数组countries
列已编入索引country
列的现有字符串值保存到数组中
或者换句话说
country: 'US'
成为
countries: ['US']
1条答案
按热度按时间5kgi1eie1#
这不是执行此类迁移的安全方法。您应该改为:
1.更新模型以并发写入两列,例如在
after_save
回调中,以便将对country
的更改传播到countries
。此时,两列将不会完全同步。1.保存每个产品记录(例如,
Product.find_each(&:save!)
),以便触发回调,将值从country
推送到countries
。此时,两列将完全同步。1.更新您的应用,使其不再使用
country
属性,而仅使用countries
属性。之后,两列将不再同步,但countries
将具有正确的值。1.创建迁移以从表中删除旧列:
完成这些步骤后,就可以开始使用
countries
列存储多个字符串。几个注意事项:
product
而不是products
,这违反了Rails的约定。