假设你在 Rails 中有一个对象数组@objects
如果我想显示前 5 个对象,使用有什么区别:
@objects.limit(5)
@objects.take(5)
@objects.first(5)
我说的是前端(Ruby),而不是 SQL。对象在 SQL 中不受限制的原因是因为相同的数组可以在其他地方使用而无需对其施加限制。
它与对象实例化有什么关系吗?
假设你在 Rails 中有一个对象数组@objects
如果我想显示前 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)
将范围添加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)
将不起作用,但其他两个将起作用。
选择的答案似乎已经过时(就 Rails 而言),所以我想更新一些信息。
limit
on anActiveRecord::Relation
仍将是 a Relation
。所以如果你打电话:
Model.limit(5).limit(4)
将与以下内容相同:
Model.limit(4)
first
on anActiveRecord::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
. 而with limit
and take
there is not ORDER BY
included,但排序取决于数据库排序实现。