Ruby中的数组:Take vs Limit vs First
假设您在Rails @objects
有一个对象数组
如果我想显示前5个对象,使用时有什么区别:
-
@objects.limit(5)
-
@objects.take(5)
-
@objects.first(5)
我说的是前端(Ruby),而不是SQL 。 对象不受SQL限制的原因是因为可以在别处使用相同的数组而不对其应用限制。
它与对象实例化有什么关系吗?
- limit不是数组方法
- 需要一个论点; 如果数组为空,则返回一个空数组。
- 首先可以不带参数调用; 如果数组为空且参数不存在,则返回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方面:
-
limit(5)
将limit(5)
的范围添加到ActiveRecord::Relation
。 它不能在数组上调用 ,因此limit(5).limit(4)
将失败。 -
first(5)
将limit(5)
的范围添加到ActiveRecord::Relation
。 它也可以在一个数组上调用,所以.limit(4).first(3)
.first(4).first(3)
将与.limit(4).first(3)
。 -
take(5)
将在当前作用域中运行查询,构建所有对象并返回第一个5. 它只适用于数组 ,因此Model.take(5)
将不起作用,尽管其他两个将起作用。