2017-06-16 1 views
0

A product hat viele uploads, zu erhalten und ein import viele products hat. Ich möchte alle Uploads mit den Produkten eines bestimmten Imports verknüpfen.effizienteste Weg has_many Beziehungen eines Arrays von Datensätzen

Hier ist, was ich tue:

@import = Import.includes(products: [:uploads]).find(params[:id]) 
@products = @import.products 
@uploads= @products.map{|product| product.uploads.where.not(file: nil)}.flatten 

Aber es scheint ziemlich ineffizient. Gibt es eine andere Lösung?

+0

Haben Sie alle Produkte und ihre Uploads für Ihre Ansichten laden müssen oder nur die Daten zu manipulieren? – bkunzi01

+0

Ich muss alle Produkte und Uploads für die Ansicht laden –

Antwort

0

Wie wäre:

@import = Import.includes(:products).find(params[:id]) 
@products = @import.products.pluck(:id) 
@uploads = Upload.where(products_id: [@products]).where.not(file: nil) 

Pluck vermeidet jeden Datensatz insantiating und schnappt sich die ids direkt aus der Datenbank. Dies sollte Zeit sparen gegenüber der Instantiierung jedes Produkts mit dem map Iterator.

3

Da ein import viele products hat, nehme ich an, dass ein product zu einem import gehört; Wenn ja, könnten Sie versuchen products abzufragen, wie folgt aus:

@uploads = Product.where(import_id: params[:id]).joins(:uploads).where.not(file: nil) 
+0

Ich mag es besser! – bkunzi01

Verwandte Themen