В последних двух постах я познакомил вас с некоторыми из моих любимых новых функций в бета-версии 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)
Каждый из этих методов — where
order
limit
includes
отношением . Отношение ведет себя так же, как и объект модели, поэтому вы можете связать столько методов вместе, сколько захотите. Круто то, что приведенный выше код на самом деле не запускает SQL-запрос. Это просто запоминание всего, что вы пытаетесь выбрать в форме этого объекта отношения. Запрос выполняется только тогда, когда вам нужно получить доступ к содержимому выбора.
Допустим, я тогда написал:
recent.each { |a| puts a.title }
Будет выполнен запрос к базе данных, и название каждой статьи будет последовательно выводиться на консоль. Этот новый цепочечный синтаксис более читабелен, дает вам гораздо больше гибкости при игре с коллекциями ваших моделей, а также делает некоторые формы кэширования более эффективными (поскольку определенные действия в контроллерах больше не должны будут выполнять запросы к базе данных, их результаты могут быть эффективно кешируется.)
Конечно, я только что рассказал о новом API запросов в Rails 3. Вы можете прочитать более подробный отчет в блоге Пратика .
Более того, функции, о которых я рассказывал в этой серии, — это лишь некоторые из новых функций в Rails 3 (хотя, на мой взгляд, самые яркие из них!) Если прошло некоторое время с тех пор, как вы заглянули во вселенную Rails, у вас нет времени быть повторно знакомым.