Ответ 1
- limit не является методом массива
- take требует аргумента; он возвращает пустой массив, если массив пуст.
- сначала можно вызвать без аргумента; он возвращает nil, если массив пуст и аргумент отсутствует.
Источник для 2.0 take
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)
добавит область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)
не будет работать, хотя остальные два будут работать.