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

时间:2014-01-05 19:03:44

标签: ruby-on-rails arrays class default null

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

我尝试使用代码添加迁移

class AddShareToDocuments < ActiveRecord::Migration
  def change
    add_column :documents, :share, :array, :default => []
  end
end

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

通过键入

在rails控制台沙箱中创建一个新数组
newarray = []

说newarray.class是Array。

有人能发现我做错了吗?

3 个答案:

答案 0 :(得分:77)

Rails 4 PostgreSQL阵列数据类型

在终端

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

答案 1 :(得分:6)

如果要支持所有数据库,则必须在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

答案 2 :(得分:3)

数组通常不是存储在数据库中的类型。正如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

就生成迁移而言,这可能很麻烦,但您可以创建一个新的迁移,将类型更改为“string”(编辑:正确的代码):

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