Разница между методами поиска 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) и вернув массив)