2013-05-15 8 views
18

Angenommen, Sie ein Array von Objekten in Rails haben @objectsArrays in Ruby: Nehmen Sie vs Limit-vs Erste

Wenn ich die ersten 5 Objekte angezeigt werden soll, was ist der Unterschied zwischen der Verwendung von:

  1. @objects.limit(5)
  2. @objects.take(5)
  3. @objects.first(5)

Ich spreche über das Front-End (Ruby), NICHT SQL. Der Grund, warum die Objekte in SQL nicht beschränkt sind, liegt darin, dass das gleiche Array an anderer Stelle verwendet werden kann, ohne dass eine Begrenzung darauf angewendet wird.

Hat es etwas mit der Instanziierung von Objekten zu tun?

+1

Sind Sie sicher, dass @objects ein Array ist? Ich habe noch nie von einer #limit-Methode gehört. #first ist jedoch eine Standardmethode, um das erste Element zurückzugeben. #take ist auch eine Methode. – seand

+0

Ja '@ Objekte' ist ein Array. Ich habe die "# limit" -Methode angewendet und es schien die gleiche Aufgabe ausgeführt zu haben wie "# take" und "# first". (In der Ansicht nicht der Controller). – Prem

+1

@objects ist wahrscheinlich kein Array, sondern eine ActiveRecord-Beziehung. Deshalb benutzt du Limit (5). –

Antwort

24
  1. Grenze kein Array-Methode
  2. take ein Argument erfordert; Wenn das Array leer ist, wird ein leeres Array zurückgegeben.
  3. kann zuerst ohne ein Argument aufgerufen werden; Es gibt nil zurück, wenn das Array leer ist und das Argument nicht vorhanden ist.

Quelle für 2.0 nehmen

   static VALUE 
rb_ary_take(VALUE obj, VALUE n) 
{ 
    long len = NUM2LONG(n); 
    if (len < 0) { 
     rb_raise(rb_eArgError, "attempt to take negative size"); 
    } 
    return rb_ary_subseq(obj, 0, len); 
} 

Quelle für 2.0 zuerst:

   static VALUE 
rb_ary_first(int argc, VALUE *argv, VALUE ary) 
{ 
    if (argc == 0) { 
     if (RARRAY_LEN(ary) == 0) return Qnil; 
     return RARRAY_PTR(ary)[0]; 
    } 
    else { 
     return ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST); 
    } 
} 

In Bezug auf die Schienen:

  1. limit(5) wird ein dd der Anwendungsbereich von limit(5) zu einem ActiveRecord::Relation. Es kann nicht auf einem Array aufgerufen werden, so limit(5).limit(4) wird fehlschlagen.

  2. first(5) wird den Bereich von limit(5) zu einem ActiveRecord::Relation hinzufügen. Es kann auch auf einem Array aufgerufen werden, so .first(4).first(3) wird gleich .limit(4).first(3) sein.

  3. take(5) wird die Abfrage im aktuellen Bereich laufen, bauen alle Objekte und kehren die ersten 5. Es funktioniert nur auf Arrays, so wird Model.take(5) nicht funktioniert, obwohl die anderen beiden arbeiten.

+0

Sind Sie sicher, '# Limit' ist keine Array-Methode? Ich habe es auf eine Ansicht in einem Objekt-Array '@ objects' angewendet und es hat die gleiche Aufgabe wie' # take' und '# first' ausgeführt.'# first' kann ein Argument annehmen (optional). Probieren Sie es selbst aus – Prem

+0

Ja, siehe Änderungen in Bezug auf Schienen. –

+0

'take()' kann ohne ein Argument aufgerufen werden. – 0112