Rails com acesso turbinado ao banco

August 30th, 2007 § 4 comments

Uma das coisas interessantes no uso de Seaside e Smalltalk é o Glorp, uma camada de acesso ao banco de dados que permite o uso da própria sintaxe do Smalltalk para gerar queries. Essa é uma das coisas que o Rails não tinha e, por melhor que a sintaxe do ActiveRecord seja, ainda é muito opaca.

A palavra-chave na frase acima é tinha porque agora o Rails pode contar com isso. Um grupo de luminares da comunidade Rails lançou uma nova gem chamada ambition que faz exatamente isso. Embora o projeto esteja no começo, já está funcionando a todo vapor e os resultados são promissores.

Alguns exemplos do uso estão abaixo (retirados diretamente da entrada referenciada acima) e mostram o potencial de uma ferramenta assim:

User.first
SELECT * FROM users LIMIT 1 

User.select { |m| m.name != "macgyver" }
SELECT * FROM users WHERE users.name <> "macgyver" 

User.select { |u| u.email =~ /chris/ }.first
SELECT * FROM users WHERE (users.email REGEXP "chris") LIMIT 1 

User.select { |u| u.karma > 20 }.sort_by(&:karma).first(5)
SELECT * FROM users WHERE (users.karma > 20)
ORDER BY users.karma LIMIT 5 

User.select { |u| u.email =~ "ch%" }.size
SELECT count(*) AS count_all FROM users 
 WHERE (users.email LIKE "ch%") 

User.sort_by { |u| [ u.email, -u.created_at ] }
SELECT * FROM users ORDER BY users.email, users.created_at DESC 

User.detect { |u| u.email =~ "chris%" && u.profile.blog == "Err" }
SELECT users.id AS t0_r0 ... FROM users 
LEFT OUTER JOIN profiles ON profiles.user_id = users.id 
WHERE ((users.email LIKE "chris%" AND profiles.blog = "Err")) 
LIMIT 1 

Como é fácil perceber, a leitura do código fica muito mas interessante e prático, reduzindo a possibilidade de erros e aumentando a expressividade da linguagem. Esse é possivelmente o melhor exemplo de uma DSL que eu já vi para o Ruby/Rails e com certeza vai se tornar algo dominante entre os desenvolvedores.

§ 4 Responses to Rails com acesso turbinado ao banco"

  • Rob says:

    Eu fiz algo parecido em Python:

    http://cheeseshop.python.org/pypi/simpleQL

    Mas não permite inserts nem queries mais complexas.

    Roberto

  • Eu gostei, mas será que a comunidade vai adotar?

  • Witaro says:

    Poxa, “roubaram” minha idéia :p Fiz algo parecido (e limitado) numa recente implementação minha de ActiveRecord no Delphi (Ah, isso pq *é* preciso fazer algo novo e grande num sistema legado…). Achei genial o “|u|”, não tinha pensado nisso… Agora, não gostei do nome “detect”, nem da confusão entre “Entidade” e “Coleção de Entidades” que “Entidade.Select” causa. Para resolver isso (e outras coisas) eu implemento “Repository” de forma genérica que me serve tanto como DAO (na verdade abstraindo este caso exista ou não) quanto como Coleção da Entidade (Fiz ele descender da minha TColletion). Enfim, não é pq o sistema é legado que as idéias usadas precisam ser…

  • Ronaldo says:

    Roberto, ficou muito legal a implementação. Bem Python mesmo. :-)

    Carlos, não garanto, mas é muito melhor do que o ActiveRecord. Com uma refinada e suporte a todos os métodos possíveis, vai ficar muito bom–especialmente no que tange a buscas mais complexas de uma forma mais simples.

    Witaro, o Glorp, do Smalltalk, usava o conceito de repositório até uma versão mais recente mas agora também aceitam uma espécie de ActiveRecord. Eu acho que é uma espécie de meio termo porque um conceito mais direto é mais útil quando se está começando.

Leave a Reply

Your email address will not be published. Required fields are marked *

What's this?

You are currently reading Rails com acesso turbinado ao banco at Superfície Reflexiva.

meta