2015-09-05 7 views
10

Wie deklarieren Sie eine Array-Spalte in Rails?Hinzufügen einer Array-Spalte in Rails

Details

Ich habe folgendes Modell

rails generate model User address:text 

aber ich ein Modell wollen, die mehrere Adressen pro Benutzer speichern kann. Die folgende Erklärung gibt mir einen Fehler

rails generate model User address[]:text 

Wie deklarieren Sie eine Array-Spalte in Rails?

+0

mögliche Duplikate von [Speichern von Arrays in der Datenbank: JSON vs. serialisiertes Array] (http://stackoverflow.com/questions/21312278/storing-arrays-in-database-json-vs-serialized-array) –

+0

Dies sollte wahrscheinlich ein http: //apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many ... –

Antwort

11

Sie folgende verwenden können Schritte

rails g migration add_subjects_to_book subjects:text 

Und die Migrationsdatei:

2.1.2 :001 > b = Book.create 
    (0.2ms) BEGIN 
    SQL (2.0ms) INSERT INTO "books" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id" [["created_at", "2014-10-17 08:21:17.870437"], ["updated_at", "2014-10-17 08:21:17.870437"]] 
    (0.5ms) COMMIT 
=> #<Book id: "39abef75-56af-4ad5-8065-6b4d58729ee0", title: nil, created_at: "2014-10-17 08:21:17", updated_at: "2014-10-17 08:21:17", description: {}, metadata: {}, subjects: []> 

2.1.2 :002 > b.subjects.class 
=> Array 

Wenn Sie als

folgt
create_table :products do |t| 
    t.string :name, null: false 
    t.references :category, null: false 
    t.text :tags, array: true, default: [] 
end 
7

Die Beispiele können tun Sie Array hinzufügen möchten, während Tabelle erstellen:

class AddSubjectsToBook < ActiveRecord::Migration 
    def change 
    add_column :books, :subjects, :text, array:true, default: [] 
    end 
end 

Wir haben es jetzt überprüfen Wenn Sie array: true verwenden, benötigen Sie Postgres oder eine andere Datenbank, die zu einem Array-Typ in der Lage ist. Verwenden Sie für MySQL die generische Serialisierung, mit der Sie beliebige Typen in einer Spalte speichern können.

create_table :users do |t| 
    t.text :addresses, default: [].to_yaml 
    ... 
end 

class User < ActiveRecord::Migration 
    serialize :addresses, Array 
end 

u = User.new 
u.update_attributes addresses: ["123 Evergreen", "246 Main"] 

Die üblichen Einschränkungen gelten für das Speichern von Arrays in einer Datenbank. Es geht gegen den Strich von relationalen Datenbanken, um dies zu tun und wird es schwierig, langsam oder unmöglich machen, Dinge wie die Suche nach einem einzelnen Gegenstand zu tun. Es kann jedoch eine gute Lösung für die grundlegende Speicherung sein, bis Sie diese Dinge tun müssen.

Verwandte Themen