5

I haben Modelle User, Photo und Favorite, wo favorites eine Tabelle aus users zu photos verbinden ist, das heißt:Erstellen mehrerer has_many über Verbände aus einem Array von IDs

class User < ActiveRecord::Base 
    has_many :favorites 
    has_many :photos, through: `favorites` 
end 

class Photo < ActiveRecord::Base 
    has_many :favorites 
    has_many :users, through: `favorites` 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :photo 
end 

sagen, dass @user ist eine Instanz User und photo_ids ist ein Array von Primärschlüsseln von Fotos. Was ist die schnellste und/oder prägnanteste Art, all diese Fotos zu @user.photos hinzuzufügen?

Das Beste, was ich kann mit ist:

@user.favorites.create(photo_ids.map { |id| {photo_id: id } }) 

Aber das scheint mir ziemlich ausführlich. Hat Rails keine bessere Lösung?

Andere Fragen sprechen über die Erstellung mehrerer has_many: through: Assoziationen durch ein geschachteltes Formular, aber ich versuche, dies in einer JSON-API zu tun, so dass keine Formulare beteiligt sind.

Antwort

6

Wie wäre es

@user.photos << Photo.find_all_by_id(photo_ids) 
+0

Haben Sie 'nicht erkennen konnte <<' auf einer Active Vereinigung. Vielen Dank! – GMA

+0

Beachten Sie auch, dass das Objekt auf der rechten Seite ein Array ist - es funktioniert aber immer noch. – BroiSatse

+0

Eigentlich glaube ich nicht, dass das funktionieren würde, würde 'Photo.find_by_id' nur ein Ergebnis zurückgeben? 'Photo.where (id: photo_ids)' oder 'Photo.find (photo_ids)' funktionieren beide gut. – GMA

Verwandte Themen