2017-03-29 2 views
0

Wenn ich ein Playlist-Modell habe, wie kann ich Arrays in eine Spalte schieben?Ruby on Rails - Arrays zu Spalte hinzufügen

#<Playlist id: 1, title: "This is a playlist", songs_ids: 1> 

Und wollen Arrays der songs_ids Spalte schieben was soll ich tun muss?

Dies ist, wie die songs_ids Spalte aussehen

add_column :playlists, :songs_ids, :integer, array: true, default: [] 

Ich habe versucht, die Attribute aktualisiert und ergänzt annother id eines Songs, aber ich habe kein Glück mit ihm entweder:

Playlist.find(1).update_attribute(songs_ids: [1, 2]) 
+0

Mögliche Duplikat [Rails: Migration Hinzufügen eines Array hinzufügen (default leer)] (http://stackoverflow.com/questions/20937792/rails-adding-migration-to-add-an-array- default-empty) – DiodonHystrix

+0

Serialisieren Sie das Array in Ihrer Modellklasse? 'serialize: song_ids, Array' in' Playlist.rb' http://apidock.com/rails/ActiveRecord/Base/serialize/class – KyleHodgetts

+0

@muistooshort ich Mysql-Datenbank für die Entwicklung und Postgres für die Produktion –

Antwort

1

Wenn Sie Postgresql verwenden, können Sie einfach die update_all Methode verwenden, um Array-Spalten in Ihrem Modell zu aktualisieren.

Playlist.where(id: 1).update_all(songs_ids: [1,2]) 

Hinweis wird es nicht mit Playlist.find(1)... arbeiten.

Mit Mysql können Sie serialize10 betrachten, dazu müssen Sie eine String-Typ-Spalte verwenden.

Geben Sie dann das Attribut an, das in Ihrem Modell serialisiert werden soll.

class Playlist < ActiveRecord::Base 
    serialize :songs_ids, Array 
end 

Dann können Sie einen beliebigen Wert testen.

playlist = Playlist.first 
playlist.songs_ids << 1 
=> [1] 
playlist.save 
playlist.songs_ids << 2 
=> [2] 
playlist.save 
playlist.songs_ids 
=> [1, 2] 
+0

Verwenden Sie dies mit Postgres wird in der Entwicklung arbeiten? –

+0

Getestet in Postgresql funktioniert das, auf Mysql tut es das nicht, dieses hält das Attribut 'songs_ids' als' nil' nach der Operation. –

+0

Es funktioniert nicht, auch wenn ich serialisieren, weil, wie Sie erwähnt haben, ich denke, es ist mit der Datenbank zu tun, und ich denke, das ist die einzige Problemumgehung dafür? –