假设您在Rails @objects
如果我想显示前5个对象,使用之间有什么区别:
@objects.limit(5)
@objects.take(5)
@objects.first(5)
我说的是前端(Ruby), NOT SQL 。对象在SQL中不受限制的原因是因为可以在别处使用相同的数组而不对其应用限制。
是否与对象实例化有关?
答案 0 :(得分:27)
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
。 也可以在数组上调用,因此.first(4).first(3)
与.limit(4).first(3)
相同。
take(5)
将在当前范围内运行查询,构建所有对象并返回第一个5. 仅适用于数组,因此Model.take(5)
将没有用,虽然其他两个都可以。
答案 1 :(得分:1)
选择的答案似乎已经过时了(就Rails而言),所以我想更新一些信息。
limit
上的ActiveRecord::Relation
仍然是Relation
。因此,如果您致电:Model.limit(5).limit(4)
将与:
Model.limit(4)
first
上的ActiveRecord::Relation
将使结果成为Array
。因此,您无法在first
之后调用任何范围,例如:Model.first(5).where(id: 1)
但是您可以这样做:
Model.limit(5).where(id: 1)
take
Model.take(5)
现在可以使用。它将返回一个数组,因此您也不能调用任何scope
。
在ActiveRecord::Relation
对象上,如果调用first
,它将包含ORDER BY 'tables'.id
。使用limit
和take
时,不包含ORDER BY
,但排序取决于数据库排序实现。