2014-01-05 56 views
10

我试图将名为share的列添加到我的资源之一。 这个想法是,用户可以上传文档并与其他(特定)用户共享它们,并且该数组包含用户想要共享的那些电子邮件。Rails:添加迁移以添加数组(默认为空)

我尝试添加迁移与代码

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

但是,当我在命令提示符下开拓轨道控制台,它说,份额:零和user.document.share.class是NilClass。

通过键入

newarray = [] 

创建在轨控制台沙箱的新数组说newarray.class是数组。

任何人都可以发现我做错了什么吗?

+0

你使用的是Postgres,并希望其数组类型? –

+0

我相信我正在使用SQLite。我安装了PostgreSQL,但我不认为我正在为此应用程序使用它。我想将一个名为“share”的变量添加到“文档”中,我希望“share”的类型是一个数组。 – user2669464

+0

如果其中任何一种解决方案都适合您,您应该接受效果最佳的答案。其他问题也一样。对于那些从现在开始遇到问题的人来说,它更加清楚哪些是有效的,哪些没有。如果两者都行不通,但你自己想清楚了,你应该发布你所做的并接受它。 –

回答

5

如果你想支持所有的数据库,你必须序列化数组中的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

+0

感谢您的支持。但我只是试图回滚我的最后一次迁移,我得到了“未定义的方法”to_sym'无类“错误。我一直试图谷歌的解决方案,这无济于事。对此有何帮助?所以我甚至无法撤销上一次迁移来序列化数组。 – user2669464

+0

你可以删除数据库吗? 'rake db:drop db:create'然后像我描述的那样改变你的迁移并运行'rake db:migrate'。 – michelemina

+0

rake db:drop不起作用。 “无法删除db/development.sqlite3:# user2669464

2

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

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

class Share 
    belongs_to :user 
    belongs_to :document 
end 

然后,在你的文档类,

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

至于产生迁移,这可能是哈克,但你可以创建一个新的迁移,改变类型为“字符串”(编辑:正确的代码):

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

感谢您的这个想法。一旦我的迁移再次开始,我会尝试一下。我不知道:通过关联。当您提到将类型更改为“字符串”时,是否指的是类Share?在你的迁移代码中,我没有看到如何将它转换为字符串类型。 – user2669464

+0

对不起,懒惰适应我的部分。我想表达的意思是编辑。希望这可以工作。 –