2014-01-05 9 views
10

Ich versuche, eine Spalte namens Share zu einer meiner Ressourcen hinzufügen. Die Idee ist, dass Benutzer Dokumente hochladen und sie mit anderen (bestimmten) Benutzern teilen können, und das Array enthält die E-Mails derer, mit denen der Benutzer teilen möchte.Rails: Hinzufügen von Migration zum Hinzufügen eines Arrays (Standard leer)

Ich versuchte, eine Wanderung mit dem Code hinzufügen

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

Aber wenn ich Schienen Konsole in der Eingabeaufforderung öffnen, heißt es, dass Aktien: nil und user.document.share.class NilClass ist.

Erstellen ein neues Array in der Sandbox Schienen Konsole von

eingeben
newarray = [] 

sagen, dass newarray.class Array ist.

Kann jemand feststellen, was ich falsch mache?

+0

Sind Sie Postgres verwenden und seine Array-Typ? –

+0

Ich glaube, ich verwende SQLite. Ich habe PostgreSQL installiert, aber ich glaube nicht, dass ich es für diese Anwendung verwende. Ich möchte eine Variable mit dem Namen "share" zu "document" hinzufügen und ich möchte den Typ "share" als Array definieren. – user2669464

+0

Wenn eine dieser Lösungen für Sie funktioniert, sollten Sie die Antwort akzeptieren, die am besten funktioniert. Gleiches gilt für alle anderen Fragen, die Sie gestellt haben. Es macht es für jeden anderen klar, der ab jetzt auf deine Frage zugreift, was funktioniert hat und was nicht. Wenn beides nicht funktioniert hat, aber Sie es selbst herausgefunden haben, sollten Sie das, was Sie getan haben, posten und es akzeptieren. –

Antwort

5

, wenn Sie alle Datenbanken unterstützen wollen, müssen Sie das Array in einem String serialisiert

class Documents < ActiveRecord::Base 
serialize :share 
end 

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

Bei Postgresql und Array-Datentyp I https://coderwall.com/p/sud9ja

+0

Danke dafür. Aber ich habe gerade versucht, meine letzte Migration rückgängig zu machen, und ich bekomme die "undefined Methode 'to_sym' für nil class" -Fehler. Ich habe versucht, die Lösung dazu googeln, ohne Erfolg. Irgendwelche Hilfe dazu? Daher kann ich meine letzte Migration nicht rückgängig machen, um das Array zu serialisieren. – user2669464

+0

Können Sie die Datenbank löschen? 'rake db: drop db: create' dann ändere deine Migration wie ich es beschrieben habe und führe 'rake db: migrate' aus. – michelemina

+0

Rake db: Drop funktioniert nicht. "Db/development.sqlite3 konnte nicht gelöscht werden: # user2669464

2

Arrays sind normalerweise nicht ein Typ in einem gespeichert werden gefunden Datenbank. Wie michelemina darauf hinweist, können Sie sie in einen String serialisieren und speichern, wenn der Typ der Daten im Array einfach ist (Strings, Int usw.). Für Ihren Fall von E-Mails könnten Sie dies tun.

Wenn Sie andererseits alle Benutzerobjekte finden möchten, mit denen ein Dokument geteilt wurde, gibt es dafür bessere Möglichkeiten. Sie werden eine "Join Tabelle" wollen. In Ihrem Fall das Objekt Mitmach Tabelle kann einen Anteil genannt werden, und haben die folgenden Attribute:

class Share 
    belongs_to :user 
    belongs_to :document 
end 

Dann in die Dokumentenklasse,

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

Soweit die Erzeugung der Migration, diese kann hacky, aber Sie könnten eine neue Migration erstellen, die den Typ "string" (Edit: korrekten Code): ändert

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

Danke für diese Idee. Ich werde es versuchen, sobald ich meine Migrationen wieder zur Arbeit bekomme. Ich wusste nichts über die: durch die Assoziation. Wenn Sie den Typ in "String" geändert haben, beziehen Sie sich auf die Klasse Share? In Ihrem Migrationscode sehe ich nicht, wie daraus ein String-Typ wird. – user2669464

+0

Entschuldigung, faul Anpassung von meiner Seite. Was ich zeigen wollte, wurde bearbeitet. Hoffe, das funktioniert. –