Возьму свои слова назад, и процетирую сегодняшнее сообщение DHH:
— Rails 3 beta is almost ready for public testing. We're just hammering out the last bugs in Bundler. Stay tuned.
Суть «ленивости» в том, что можно сколько угодно строить цепочку вызовов (очень грубо говоря — стоить SQL запрос), и даже после последнего вызова не будет выполнен непосредственно запрос к БД.
Запорос к БД для указанной цепочки можно выполнить обратившись к переменной new_users как к коллекции записей, которая ожидается от БД.
С приходом Ruby 1.9.1 в рельсы (а это будет реккомендованой версией для Rails 3) ситуация со скоростью интерпретации значительно улучшится. Прибавте к этому всевозможные правки и оптимизации, которые они сейчас проводят (судя по отзывам ребят из Ruby noname podcast — Rails 3 уже быстрее в ~1.5 раза) — вот вам и победа на «медленными шаблонами».
1) я думаю connection.execution(«сложный запрос») они оставят — без него иногда никак
2) если создавать веб-сайт, ориентируясь на сложные нагрузки, то задумываешься о том, чтобы использовать mongoDB, amazonDB, simpleDB, может быть и не сейчас, но чтобы код был готов к этому и легко портировался и зная, что там не особо разыграешься с SQL, то стараешься писать простые запросы из одной таблицы… и такие вещи самое то
3) в одном моем проекте (переписанным на Rails сначала как калька с PHP) запросы начали постепенно приходит к виду ObjectName.active.most_popular, где active, most_popular это соответствующие name_scope
В Rails 3.0 специально исключают такой подход (см. начало статьи, там где говорится о хеше options) в пользу адаптации реляционной алгебры, где составление запросов происходит несравнимо гибче.
_гагляднее некуда
соглашусь с Огневским, что этот синтаксис уступает стандартному рельсовому запросу
$model = Item::model->findAll(array('limit'=>10, 'order'=>'id DESC', 'condition '=> 'date > 01-02-2010'));
vs
model = Item.find(:all, :limit => 10, :order => 'id DESC', :conditions => 'date > 01-02-2010')
речь лишь о паре лишних символов, но тем не менее камень в сторону _гаглядности
далее, ребята из кортим пошли ровно тем же путем, что вы демонстрировали ниже в своем многострочном запросе. Они тоже своеобразно разбили запрос. Только он вызывается цепочкой, а не объявлением параметров поиска с новой строки. И это бесспорно умнее и просто красивее.
model = Item.limit(10).order('id DESC').conditions('date > 01-02-2010').all
Обратите внимание, что буковок стало еще меньше, а читабельность повысилась.
В принципе, эти вот «последствия объектности» многим (и мне в том числе) очень нравятся.
Будет больше похоже на какое-нибудь array.map(&:id).map(&:name).capitalize.to_sym ;)
Ну не знаю, мне банально надоедает смотреть на все эти str_*() и array_*(), почему нельзя сделать ООП, хотя бы в части того, чтобы у строк/массивов были методы? Уродливый синтаксис, правда.
ActiveRecord Query Interface 3.0