Загрузка...

Ruby & Rails: веб-разработка с удовольствием

Ruby on Rails — фреймворк для создания веб-приложений. Является открытым программным обеспечением (лицензия MIT). Здесь мы обсуждаем новости RoR, делимся учебными материалами и интересными находками С RoR даже сложные веб-приложения могут быть написаны за считанные дни. Это действительно разработка с удовольствием!
     

ez_where

03.11.09, 16:36
Автор mshakhan

Что-то тут очень давно никто ничего не писал, надо исправлять ситуацию.

Используя ActiveRecord меня всегда коробило, когда приходилось писать запрос для поиска в виде sql-строки (а происходило это достаточно часто). Дело в том, что стандартные finder-ы заточены под очень простые запросы, как правило, для одновременного выполнения условия для нескольких полей. Для более сложных запросов приходилось писать строку с подстановкой парметров в нее. Ничего особо страшного, но как-то не по рубивейному =). Частично эту задачу решал searchlogic, но все равно это было не то.

И вот, недавно, наткнулся на плагин ez_where. Чтобы не лить воду, приведу сразу примеры:

articles = Article.ez_find(:all, :include => :author) do |article, author|
  article.title =~ "%Foo Title%"
  author.any do
    name == 'Ezra'
    name == 'Fab'
  end 
end

Наверное, можно срзу понять, что тут происходит, но, все же поясню. Данный пример преобразуется в следующий код:

articles = Article.find(:all, :conditions => [
   "article.title LIKE ? AND (authors.name = ? OR authors.name = ?)",
  "%Foo Title%", "Ezra", "Fab"
])

Теперь, я думю, все понятно. По мне, первый вариант выглядит более красиво, чем второй. Кроме того, мы можем создвать запросы отдельно от модели, а потом использовать их для поиска. Вот так:

cond = Caboose::EZ::Condition.new do
  foo == 'bar'
  baz < => (1..5)
  id === [1, 2, 3, 5, 8]
end
 
@result = Model.find(:all, :conditions=> cond.to_sql)
#=> ["foo = ? AND baz BETWEEN ? AND ? AND id IN (?)", "bar", 1, 5, [1, 2, 3, 5, 8]]

Собственно, все =) Возможно, для кого-то этот плагин не является сюрпризом, тем более, что он довольно старый. Но мне он показлся очень удобным.

Ссылки:

Описание (использовалось в статье)

Репозиторий

Комментарии

Попробуйте от роботов
http://wiki.github.com/thoughtbot/squirrel
очень не плох

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

Ну, и потом, практика делать различные короткие named_scope, а потом их использовать, намного лучше.

Плюс, этот плагин какбэ подталкивает тебя писать запросы в контроллере, что тоже является плохой практикой.

Не понял, чем он подталкивает писать запросы в контроллере и что мешает это делать в модели =)
Скоупы не помогут при сложных запросах, в которые, например, нужно включать или нет опеределенные условия в зависимости от параметров.

Войдите, чтобы оставить комментарий