ActiveRecord的finder方法之间的区别:take vs limit(1)

时间:2013-10-01 18:27:35

标签: ruby-on-rails activerecord ruby-on-rails-4

考虑以下ActiveRecord的finder方法。

  • .take。例。 Account.take
  • .limit(1)示例。 Account.limit(1)

现在, 虽然两种方法都有不同的名称,但它们生成相同的查询:

SELECT "accounts".* FROM "accounts" LIMIT 1

那么,.take和...之间的区别是什么? .limit(1)?或者他们是一样的?

3 个答案:

答案 0 :(得分:23)

来自docs

# File activerecord/lib/active_record/relation/finder_methods.rb, line 64
def take(limit = nil)
  limit ? limit(limit).to_a : find_take 
end

take返回Array条记录,而limit返回可与其他关系链接的ActiveRecord关系。

答案 1 :(得分:5)

根据the API documentation中的代码,区别在于limit返回Relationtake返回Array

要使用limit,您需要Relation并获得关系。要使用take,您还可以使用数组(因为Array也有take),您还可以获得Array。因此,如果您还需要Array,请使用take,您不必担心源对象是Relation还是Array

答案 2 :(得分:2)

limit(1)将返回一个ActiveRecord :: Relation,这意味着你可以将更多链接到它上面(例如Account.limit(1).where(...)

take将返回一个数组(来自已加载的查询,或执行limit(1)并返回数组)