
ActiveRecord: опасная магия. Часть 2
Laranto 23 минуты назад ActiveRecord: опасная магия. Часть 2 Средний 6 мин 843 Ruby * Ruby on Rails * SQL * Туториал В первой части статьи мы обсуждали, как обманчивая простота ActiveRecord приводит к проблеме N+1...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: Laranto 23 минуты назад ActiveRecord: опасная магия. Часть 2 Средний 6 мин 843 Ruby * Ruby on Rails * SQL * Туториал В первой части статьи мы обсуждали, как обманчивая простота ActiveRecord приводит к проблеме N+1 запросов, и я предложила решение через joins и select. После публикации и обсуждений я поняла, что своём примере я упустила важнейший нюанс, который превращает моё же решение в бомбу замедленного действия.
О том, сколько неочевидной логики скрыто под капотом ActiveRecord — вторая часть. Работа над ошибками: нюанс в первой частиНапомню решение из первой части. Задача: вывести списанные товары за период с именами кладовщиков, избежав N+1.
Технические детали
def get_written_off_products(clerk_id, start_date, end_date) Product . joins(:written_off_by) . where( written_off_by: clerk_id, written_off_date: start_date..
expiration_date', 'products. written_off_date', 'clerks. written_off_date DESC endРешение рабочее, в базу улетает ровно один запрос:SELECT products.
expiration_date, products. written_off_date, clerks. name AS clerk_name FROM "products" INNER JOIN "clerks" ON "clerks".
Отраслевые последствия
"written_off_by" WHERE "products". "written_off_date" BETWEEN ? written_off_date DESCНо я не сказала главного: Скрытый текстэто решение работает только пока вы обращаетесь к алиасуproduct.
Стоит вам (или коллеге через полгода) написать в цикле привычное обращение к ассоциации и вуаля:products = get_written_off_products(clerk_id, start_date, end_date) products. each do |product| puts "Имя кладовщика: #{product. clerk_name}" # 0 дополнительных запросов puts "Имя кладовщика: #{product.
name}" # +1 запрос на КАЖДЫЙ товар! endДавайте разбираться, почему N+1 вернулся! Что на самом деле не делает joinsЛогика нам подсказывает, раз мы «поджойнили» таблицу кладовщиков, значит, её данные у нас на руках.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





