Разница между методами поиска ActiveRecord: take vs limit (1)
Учитывая следующие методы поиска ActiveRecord.
-
.take
. Пример. Account.take
-
.limit(1)
Пример. Account.limit(1)
Теперь,
оба метода имеют разные имена, но они генерируют один и тот же запрос:
SELECT "accounts".* FROM "accounts" LIMIT 1
Итак, в чем разница между .take
и .limit(1)
? или они одинаковы?
Ответы
Ответ 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
В соответствии с кодом в документации API разница заключается в том, что limit
возвращает Relation
, а take
возвращает Array
.
Чтобы использовать limit
, вам нужно Relation
, и вы получите отношение. Чтобы использовать take
, вы также можете использовать Array (так как Array
имеет take
), и вы также получите Array
. Поэтому, если вы хотите Array
в любом случае, используйте take
, и вам не придется беспокоиться, если исходный объект Relation
или Array
.
Ответ 3
limit(1)
вернет ActiveRecord:: Relation, что означает, что вы можете больше на нее наложить (например, Account.limit(1).where(...)
.
take
вернет массив (либо из уже загруженного запроса, либо выполнив limit(1)
и вернув массив)