【问题标题】:Difference between ActiveRecord's finder methods: take vs limit(1)ActiveRecord的finder方法的区别:take vs limit(1)
【发布时间】:2013-10-01 18:27:34
【问题描述】:
考虑 ActiveRecord 的以下查找器方法。
-
.take。例子。 Account.take
-
.limit(1) 示例。 Account.limit(1)
现在,
两种方法虽然名称不同,但生成的查询相同:
SELECT "accounts".* FROM "accounts" LIMIT 1
那么,.take 和 .limit(1) 有什么区别?还是一样?
【问题讨论】:
标签:
ruby-on-rails
activerecord
ruby-on-rails-4
【解决方案1】:
来自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 关系。
【解决方案2】:
根据the API documentation中的代码,区别在于limit返回的是Relation,而take返回的是Array。
要使用limit,你需要一个Relation,然后你就会得到一个关系。要使用take,您还可以使用数组(因为Array 也有take)并且您还可以得到Array。因此,如果您仍然想要Array,请使用take,您不必担心源对象是Relation 或Array。
【解决方案3】:
limit(1) 将返回一个 ActiveRecord::Relation,这意味着您可以在其上链接更多内容(例如 Account.limit(1).where(...)。
take 将返回一个数组(来自已加载的查询,或者通过执行 limit(1) 并返回数组)