2013-05-15 10 views
18

Załóżmy, że masz tablicę obiektów w Rails @objectsTablice w Ruby: Take vs Limit vs Pierwszy

Jeśli chcę, aby wyświetlić pierwsze 5 obiektów, jaka jest różnica między używaniem:

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

Mówię o interfejsie użytkownika (Ruby), NOT SQL. Powodem, dla którego obiekty nie są ograniczone w SQL jest to, że ta sama tablica może być używana gdzie indziej bez stosowania limitu.

Czy ma to coś wspólnego z tworzeniem obiektów?

+1

Czy jesteś pewien, że @objects to tablica? Nigdy nie słyszałem o metodzie #limit. #pierw jednak jest standardowa metoda zwracania pierwszego elementu. #take jest również metodą. – seand

+0

Tak, że '@ objects' jest tablicą. Zastosowałem metodę '# limit' i wydawało mi się, że wykonałem to samo zadanie co' # take' i '# first'. (W widoku nie kontroler). – Prem

+1

Obiekty @objects prawdopodobnie nie są tablicą, ale raczej relacją ActiveRecord. Dlatego działa limit (5). –

Odpowiedz

24
  1. granica nie jest metodą Tablica
  2. odbioru wymaga argumentu; zwraca pustą tablicę, jeśli tablica jest pusta.
  3. pierwsza może być wywołana bez argumentu; zwraca zero, jeśli tablica jest pusta, a argument jest nieobecny.

źródło 2,0 wziąć

   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); 
} 

źródło 2,0 pierwszy:

   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); 
    } 
} 

Pod względem szyn:

  1. limit(5) BĘDZIE dd zakresu limit(5) do ActiveRecord::Relation. Nie można jej wywołać na tablicy, więc limit(5).limit(4) zakończy się niepowodzeniem.

  2. first(5) doda zakres limit(5) do ActiveRecord::Relation. Można go również wywołać na tablicy, więc .first(4).first(3) będzie taki sam jak .limit(4).first(3).

  3. take(5) będzie uruchomić kwerendę w bieżącym zakresie, budowy wszystkich obiektów i powrócić pierwszy 5. To działa tylko na tablicach, więc Model.take(5) nie będzie działać, chociaż pozostałe dwa będą działać.

+0

Czy jesteś pewien, że '# limit' nie jest metodą tablicową? Zastosowałem go do widoku na tablicy obiektów '@ objects' i wykonałem to samo zadanie co' # take' i '# first'.'# first' może przyjąć argument (opcjonalnie). Wypróbuj samodzielnie – Prem

+0

Tak, zobacz zmiany pod względem szyn. –

+0

Funkcja 'take()' może być wywołana bez argumentów. – 0112