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 ...
Oh vrai, cela devrait être plus rapide que chaque fois annexant . Merci! –