Правильная работа с ActiveRecord
июля 21, 2012 | Published in Model, Ruby on Rails, Ruby on Rails 3
Статья будет иметь несколько хаотичной. В ней я приведу несколько примеров того, что я считаю неправильной работой с ActiveRecord. Что-то в статье — истина последней инстанции, а что-то — субъективное и, возможно, ошибочное мнение автора. Статья ориентирована на тех, кто хоть немного знаком с Ruby on Rails.
Очень популярная ошибка — не использование limit(1) для выборки одиночной записи с использованием where и других методов Quering API. Суть ошибки в том, что Rails не может за вас подумать о том, что вам необходима одна единственная запись, а не все удовлетворяющие условию. В случае, когда вы не используете limit(1) будет выполняться поиск по всей таблице, а не только до первой соответствующей условию записи.
Word.where(word: 'cat') # Word Load (0.9ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat' # => [records] Word.where(word: 'cat').limit(1) # Word Load (0.7ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat' LIMIT 1 # => [record]
UPD Вообще не пользуйтесь .limit(1), вместо .limit(1) используйте first, если вам действительно необходим лишь один элемент. Дело в том, что limit(1) возвращает массив с одним единственным элементом, чтобы получить этот элемент нам необходимо вызывать еще один метод — first (Array#first), или обращаться к элементу через индекс — Model.limit(1)[0].
Tag.limit(1).first # Tag Load (1.6ms) SELECT "tags".* FROM "tags" LIMIT 1 Tag.first # Tag Load (0.8ms) SELECT "tags".* FROM "tags" LIMIT 1