Rails:添加迁移以添加数组(默认为空)

我正在尝试将一个名为share的列添加到我的一个资源中。 这个想法是用户可以上传文档并与其他(特定)用户共享,并且该数组包含用户想要与之共享的电子邮件。

我尝试使用代码添加迁移

class AddShareToDocuments  [] end end 

但是当我在命令提示符下打开rails console时,它表示share:nil和user.document.share.class是NilClass。

通过键入在rails控制台沙箱中创建一个新数组

 newarray = [] 

说newarray.class是Array。

谁能发现我做错了什么?

Rails 4 PostgreSQL Array数据类型

在终端

 rails generate migration AddTagsToProduct tags:string class AddTagsToProduct < ActiveRecord::Migration def change add_column :products, :tags, :string, array: true, default: [] end end 

https://coderwall.com/p/sud9ja/rails-4-the-postgresql-array-data-type

如果要支持所有数据库,则必须在String中序列化数组

 class Documents < ActiveRecord::Base serialize :share end class AddShareToDocuments < ActiveRecord::Migration def change add_column :documents, :share, :string, :default => [] end end 

在Postgresql和数组数据类型的情况下,我找到了https://coderwall.com/p/sud9ja

数组通常不是存储在数据库中的类型。 正如michelemina指出的那样,如果数组中的数据类型很简单(strings,int等),则可以将它们序列化为字符串并存储它们。 对于您的电子邮件,您可以这样做。

另一方面,如果您希望能够找到共享文档的所有User对象,则有更好的方法可以执行此操作。 你会想要一个“连接表”。 在您的情况下,join-table对象可以称为Share,并具有以下属性:

 class Share belongs_to :user belongs_to :document end 

然后,在您的Document类中,

 has_many :shares has_many :users, :through => :shares 

至于生成迁移,这可能是hacky,但您可以创建一个新的迁移,将类型更改为“string”(编辑:正确的代码):

 class AddShareToDocuments < ActiveRecord::Migration def up change_column :documents, :share, :string end def down change_column :documents, :share, :array, :default => [] end end