假設你有對象的Rails中的數組@objects
陣列在Ruby中:取VS極限VS首先
如果我想顯示前5個對象,正是兩者的區別:
@objects.limit(5)
@objects.take(5)
@objects.first(5)
我正在談論前端(Ruby),而不是SQL。對象在SQL中不受限制的原因是因爲相同的數組可能在其他地方使用,而不對其應用限制。
它與對象實例化有什麼關係嗎?
假設你有對象的Rails中的數組@objects
陣列在Ruby中:取VS極限VS首先
如果我想顯示前5個對象,正是兩者的區別:
@objects.limit(5)
@objects.take(5)
@objects.first(5)
我正在談論前端(Ruby),而不是SQL。對象在SQL中不受限制的原因是因爲相同的數組可能在其他地方使用,而不對其應用限制。
它與對象實例化有什麼關係嗎?
來源爲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的術語:
limit(5)
將一個dd limit(5)
的範圍爲ActiveRecord::Relation
。 它不能在數組上調用,所以limit(5).limit(4)
將失敗。
first(5)
會將limit(5)
的範圍添加到ActiveRecord::Relation
。 它也可以在數組上調用,所以.first(4).first(3)
將與.limit(4).first(3)
相同。
take(5)
將運行在當前範圍內的查詢,生成的所有對象,並返回第一5. 它僅適用於陣列,所以Model.take(5)
將無法正常工作,但其他兩個會工作。
你確定@objects是一個數組嗎?我從來沒有聽說過#limit方法。 #first然而是返回第一個元素的標準方法。 #吸引也是一種方法。 – seand
是'@ objects'是一個數組。我應用了'#limit'方法,它似乎執行了與##take和##相同的任務。 (在視圖中不是控制器)。 – Prem
@objects可能不是一個數組,而是一個ActiveRecord關係。這就是爲什麼你使用限制(5)正在工作。 –