2010-12-13 57 views
0

J'ai un modèle pour un objet Playlist qui a un nombre de pistes. C'est un: has_many: through, avec PlaylistItem comme table de jointure. Lorsque le modèle est créé, je veux simplement passer par un tableau net de track_ids pour créer tous les PlaylistItems associés (toutes les pistes existent déjà). Je l'expose comme une API, donc je ne peux pas vraiment créer de belles formes/contrôler l'entrée autant.Surcharger une affectation de modèle pour créer des modèles associés

# in PlaylistsController 
@playlist = Playlist.new :some_attr => "ABCDE", :playlist => ["123","22","11"] 

Ce que je suis en train de faire est de créer une méthode d'affectation personnalisé comme celui-ci:

class Playlist < ActiveRecord::Base 
    ... 
    def playlist=(track_array) 
    track_array.each do |track_id| 
     # check for valid track_id, add info to errors if something's wrong 
     # for valid tracks, add it to playlist_items 
     playlist_items.create(:track_id => track_id) 
    end 
    end 

Depuis que je l'utilise à créer au lieu de nouveau ici, il est une erreur parce que l'élément en cours de Playlist créé doesn Je n'ai pas encore d'identifiant. Je vais m'en tenir à la suppression de la clé et faire tout ça dans le contrôleur pour l'instant, mais je suis sûr qu'il doit y avoir un moyen d'obtenir ce tour d'affectation. Des pensées?

Mise à jour

Je viens de trouver une solution:

playlist_items << playlist_items.new(:track_id => track_id) 

semble fonctionner. Aurait dû penser de lui attribuer de nouveau aux propriétés de l'objet liste de lecture et l'utilisation de nouvelles plus tôt ...

Répondre

1

Vous pouvez essayer d'utiliser les affectations: encastrables

class Playlist < ActiveRecord::Base 
    ... 
    def playlist=(track_array) 
    self.track_ids = track_array.select do |track_id| 
     # check for valid track_id, add info to errors if something's wrong 
     # for valid tracks, return true 
    end 
    end 
    ... 
end 
+0

Oh vrai, cela devrait être plus rapide que chaque fois annexant . Merci! –