2013-05-15 30 views
18

假設你有對象的Rails中的數組@objects陣列在Ruby中:取VS極限VS首先

如果我想顯示前5個對象,正是兩者的區別:

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

我正在談論前端(Ruby),而不是SQL。對象在SQL中不受限制的原因是因爲相同的數組可能在其他地方使用,而不對其應用限制。

它與對象實例化有什麼關係嗎?

+1

你確定@objects是一個數組嗎?我從來沒有聽說過#limit方法。 #first然而是返回第一個元素的標準方法。 #吸引也是一種方法。 – seand

+0

是'@ objects'是一個數組。我應用了'#limit'方法,它似乎執行了與##take和##相同的任務。 (在視圖中不是控制器)。 – Prem

+1

@objects可能不是一個數組,而是一個ActiveRecord關係。這就是爲什麼你使用限制(5)正在工作。 –

回答

24
  1. 限制不是數組方法
  2. 取需要一個參數;如果數組爲空,它將返回一個空數組。
  3. 第一次可以被調用沒有參數;如果數組爲空且參數不存在,它將返回nil。

來源爲2.0採取

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

來源爲2.0第一:

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

在Rails的術語:

  1. limit(5)將一個dd limit(5)的範圍爲ActiveRecord::Relation它不能在數組上調用,所以limit(5).limit(4)將失敗。

  2. first(5)會將limit(5)的範圍添加到ActiveRecord::Relation它也可以在數組上調用,所以.first(4).first(3)將與.limit(4).first(3)相同。

  3. take(5)將運行在當前範圍內的查詢,生成的所有對象,並返回第一5. 它僅適用於陣列,所以Model.take(5)將無法​​正常工作,但其他兩個會工作。

+0

你確定'#limit'不是數組方法嗎?我將它應用到對象數組「@ objects」的視圖上,並執行與#take和#first相同的任務。'#第一個'可以接受一個參數(可選)。自己嘗試 – Prem

+0

是的,請參閱軌道編輯。 –

+0

'take()'可以在沒有參數的情況下調用。 – 0112