Rails t.array 与 t.string 数组:true,默认值:[]

use*_*677 3 postgresql ruby-on-rails ruby-on-rails-5

我正在使用 Rails 5 和 POSTGRES,需要添加一个数组列。我见过不同的语法来做到这一点。

之间的迁移有什么区别..

t.string, :A_options array: true, default: []
Run Code Online (Sandbox Code Playgroud)

t.integer, :A_options array: true, default: []
Run Code Online (Sandbox Code Playgroud)

t.array, :A_options
Run Code Online (Sandbox Code Playgroud)

为什么指定类型为整数或字符串?前两个与后一个有何不同?

另外,有没有办法使用 Rails 生成器添加带有 default:[] 的数组?

mu *_*ort 6

这将创建一个字符串数组,其默认值是一个空数组:

t.string :A_options, array: true, default: []
Run Code Online (Sandbox Code Playgroud)

这将创建一个整数数组,其默认值是空数组:

t.integer :A_options, array: true, default: []
Run Code Online (Sandbox Code Playgroud)

这应该是NoMethodError

t.array :A_options
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 中没有“数组”类型,只有“X 数组”,其中“X”是其他列类型。PostgreSQL 数组不是像 Ruby 数组那样的通用容器,它们更像是 C、C++、Go 等中的数组。

如果您需要一个更像 Ruby 数组的通用容器,那么也许您需要jsonb。数组jsonb可以同时保存数字、字符串、布尔值、数组、哈希值等的集合。


就生成器而言,您无法指定default: [],因为您根本无法指定default

3.5 列修饰符
[...]

null并且default不能通过命令行指定。

另请参阅我可以将默认值传递给 Rails 生成迁移吗?