Domanda

Su Ruby on Rails, per esempio, se l'oggetto del modello attore è Tom Hanks, ei tifosi "has_many" è di 20.000 oggetti Fan, poi

actor.fans

dà una matrice con 20.000 elementi. Probabilmente, gli elementi non sono pre-popolati con i valori? In caso contrario, ottenendo ogni oggetto Attore dal DB può essere estremamente che richiede tempo.

Quindi è su una "necessità di sapere"?

Quindi vuol tirare i dati quando accedo actor.fans [500], e dei dati di tiro quando accedo actor.fans [0]? Se si salta da ogni record per registrare, allora non sarà in grado di ottimizzare le prestazioni di lettura sequenziale facendo, che può essere più veloce sul disco fisso, perché i record potrebbe essere nella vicina strato di settore / piatto - per esempio, se il programma tocca 2 elementi casuali, allora sarà più veloce solo per leggere quei 2 dischi, ma se tocca tutti gli elementi in ordine casuale, allora può essere più veloce solo per leggere tutti i record in modo sequenziale, e quindi elaborare il caso elementi. Ma come RoR sapere se sto facendo solo alcuni elementi casuali o tutti gli elementi in maniera casuale?

È stato utile?

Soluzione

Perché si vuole a prendere 50000 record se si utilizza solo 2 di loro? Poi prendere solo quei due da DB. Se si desidera elencare i tifosi, allora si avrà probabilmente usare impaginazione -. Vale a dire limitare l'uso e l'offset nella query, o qualche gemma impaginazione come will_paginate

non vedo alcuna spiegazione logica per cui si dovrebbe andare il modo in cui si tenta di. Spiega una situazione reale in modo da potremmo aiutarvi.

Per quanto c'è pensare che c'è da sapere Wile carico molti oggetti associati da DB - uso: comprendono come

Actor.all(:include => :fans)

Questo ansioso-carico tutti i fan quindi ci saranno solo 2 domande invece di N + 1, dove N è una quantità di attori

Altri suggerimenti

Guardate la SQL che viene vomitato fuori dal server in modalità di sviluppo, e che vi dirà quanti record fan vengono caricati. In questo caso sarà davvero actor.fans causano a tutti di essere caricati, che probabilmente non è ciò che si desidera.

Sono disponibili diverse opzioni:

  • Usa un paginator come suggerito da Tadas;
  • impostare un altro associazione con la tabella di fan che tira dentro solo quelli che ti interessa. Questo può essere fatto sia con le condizioni sulla dichiarazione has_many, per esempio
    has_many :fans, :conditions => "country of residence = 'UK'"
  • Specificare il completo SQL per limitare le righe restituite con l'opzione :finder_sql
  • Come specificare l'opzione :limit che sarà, così, il limite, il numero di righe restituite.

Tutto dipende da cosa si vuole fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top