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