2014-01-05 80 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

對不起,懶惰適應我的部分。我想表達的意思是編輯。希望這可以工作。 –