我正在尝试将一个名为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。
有人能发现我做错了吗?
答案 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