Статьи

Изучение бета-версии Rails 3, часть III: API запросов

В последних двух постах я познакомил вас с некоторыми из моих любимых новых функций в бета-версии Ruby on Rails 3.0: диспетчер гемов Bundler и новый модуль маршрутизации . Я думаю, будет справедливо сказать, что я сохранил лучшее за последнее время: на этой неделе я углубляюсь в изменения в API запросов ActiveRecord.

Возможно ядром Rails является ActiveRecord, его библиотека объектно-реляционного отображения (ORM). Хотя была проделана большая работа по разъединению компонентов Rails 3.0, чтобы вы могли в принципе использовать любой ORM, который вы предпочитаете, ActiveRecord по-прежнему используется по умолчанию.
ActiveRecord предоставляет вам способы создания новых моделей, сохранения их в базе данных, их обновления, удаления и извлечения их информации. Тем не менее, новые функции в Rails 3 связаны, прежде всего, с тем, как вы запрашиваете базу данных для коллекций моделей, поэтому я сосредоточусь на этом здесь. Давайте сначала посмотрим на старый способ сделать это. Если вы хотели 10 самых последних статей в категории «садоводство», а также связанные с ними комментарии, вы писали:

Article.find(:all, :limit => 10, :conditions => {:category => "gardening"}, :order => "created_at DESC", :include => :comments) 

Вы вызываете метод find:all Вместо этого новый синтаксис основан на объединении нескольких методов, а не на передаче всех этих опций методу find Итак, чтобы получить те же статьи и их комментарии, вы должны написать:

 recent = Article.where(:category => "gardening").order("created_at DESC").limit(10).includes(:comments)

Каждый из этих методов — whereorderlimitincludesотношением . Отношение ведет себя так же, как и объект модели, поэтому вы можете связать столько методов вместе, сколько захотите. Круто то, что приведенный выше код на самом деле не запускает SQL-запрос. Это просто запоминание всего, что вы пытаетесь выбрать в форме этого объекта отношения. Запрос выполняется только тогда, когда вам нужно получить доступ к содержимому выбора.

Допустим, я тогда написал:

 recent.each { |a| puts a.title }

Будет выполнен запрос к базе данных, и название каждой статьи будет последовательно выводиться на консоль. Этот новый цепочечный синтаксис более читабелен, дает вам гораздо больше гибкости при игре с коллекциями ваших моделей, а также делает некоторые формы кэширования более эффективными (поскольку определенные действия в контроллерах больше не должны будут выполнять запросы к базе данных, их результаты могут быть эффективно кешируется.)

Конечно, я только что рассказал о новом API запросов в Rails 3. Вы можете прочитать более подробный отчет в блоге Пратика .

Более того, функции, о которых я рассказывал в этой серии, — это лишь некоторые из новых функций в Rails 3 (хотя, на мой взгляд, самые яркие из них!) Если прошло некоторое время с тех пор, как вы заглянули во вселенную Rails, у вас нет времени быть повторно знакомым.