<?xml version='1.0' encoding='UTF-8'?>
<elementos_gw>
  <documento>
    <id>928</id>
    <autor>5</autor>
    <nome>BD em Ruby</nome>
    <nome_facil>bd em ruby</nome_facil>
    <criacao>2011-01-18 23:40:06</criacao>
    <alteracao>2011-01-19 01:31:08</alteracao>
    <texto>Mal comecei a aprender Ruby e, já nos primeiros testes, estou precisando acessar banco de dados. Imaginava que, como existem as classes Array, String, Hash, Integer, etc., também haveria uma DB e seria só aprendê-la a usar. Mas, como em outras linguagens, acessar BD não é uma coisa única (isto é, um jeito único já provido como recurso nativo da linguagem).

[http://www.troubleshooters.com/codecorn/ruby/database/index.htm Nesta página] aprendi que há 3 formas populares de usar BD em Ruby:

1. Pelo driver do banco de dados. Isso varia muito com o driver. Exemplo:
{{{
results = mysql.query(&quot;SELECT * from rocks;&quot;)  # mysql
results = conn.exec(&#039;select * from rocks&#039;)     # postgree
results.each do |row|
  ...
end
}}}
Isso inviabiza mudanças de base de dados no futuro, pois exige alterar todo o código.

2. Pela interface DBI, que é uma interface única para diferentes bancos de dados:
{{{
query = dbh.prepare(&quot;SELECT * FROM rocks&quot;)     # o mesmo código para diferentes bancos
query.execute()
while row = query.fetch() do
  ...
end
}}}

Para quem vem do PHP, como eu, a primeira interface lembra o [http://br2.php.net/mysqli MySQLi], pela semelhança, e a segunda lembra o [http://br.php.net/pdo PDO], pela filosofia de prover uma interface independente do BD.

Na época da decisão entre o MySQLi e o PDO, optei pelo primeiro, porque não pretendia mudar de BD e porque soube que o PDO não teria como aproveitar todos os recursos do MySQL, justamente por seu desapego a algum BD em particular.

No entanto, o MySQLi, mesmo tendo uma interface orientada a objetos, não me satisfazia, pois parecia uma linguagem procedural disfarçada de OO. Então criei algumas classes para realizar //queries// e trabalhar com resultados à maneira OO, com //method chaining//, heranças e tudo o que a orientação a objetos oferece de útil e produtivo.

No exemplo acima, seria assim:
{{{
$results = $my-&gt;new_query()-&gt;from_tabela(&#039;rocks&#039;)-&gt;lc()   # retorna uma matriz linhas x colunas
foreach($results as $row) {
  ...
}
}}}

Mas é muito mais que isso. Sempre achei que os registros deveriam ser objetos, com métodos como {{{insert}}}, {{{update}}}, etc. O jeito mais apropriado de usá-las seria, por exemplo:
{{{
$query = $my-&gt;new_query()-&gt;from_tabela(&#039;rocks&#039;)-&gt;add_cond(&#039;name like ?&#039;, &#039;a%&#039;);
while ($row = $query-&gt;fetch()) {
  $id = $row-&gt;valor(&#039;id&#039;);
  $name = $row-&gt;valor(&#039;name&#039;);
  ...
}

# alterando um campo
$row-&gt;set(&#039;name&#039;, &#039;Turquesa&#039;)-&gt;update();

# inserindo um campo
my_registro::_new($my, &#039;rocks&#039;)-&gt;set(&#039;name&#039;, &#039;Ametista&#039;)-&gt;insert();
}}}

Implementei todas essas coisas.

Bom, eu havia mencionado que aprendi 3 formas de usar BD em Ruby, mas só falei de duas.

3. A terceira é o [http://ar.rubyonrails.org/ ActiveRecord], muito usada pelo framework [www.rubyonrails.org Ruby on Rails].

Quando vi os códigos de exemplo me apaixonei. Me identifiquei imediatamente. É a versão pronta para Ruby do que eu havia construído manualmente para PHP.

Nele, as tabelas são classes e as linhas são suas instâncias. É assim que as coisas têm que ser!
{{{
queryresults = Rock.find(:all)
queryresults.each do |row|
  print row.id, &quot;   &quot;, row.name, &quot;\n&quot;
end

# inserindo nova rocha:
newrow = Rock.new
newrow.name = &quot;Basalto&quot;
newrow.save
}}}

Ok, vamos aprender ActiveRecord!

Pesquisando no Google, abri algumas páginas e uma delas era sobre um tal de [http://sequel.rubyforge.org/ Sequel], que se dizia um toolkit para BD em Ruby. &quot;Um concorrente do ActiveRecord&quot;, pensei. Ora, se o AR é tão usado no Rails, por que perder tempo aprendendo outra coisa? Mas o curioso aqui foi fuçar e descobriu [http://sequel.rubyforge.org/rdoc/files/doc/active_record_rdoc.html uma comparação em que o Sequel se mostra muito superior!] (veja sobre as diferenças).

Vejamos aquele mesmo exemplo:
{{{
# select * from rocks
DB[:rocks].each do |row|
   ...
end

# com uma condição
DB[:rocks].filter{:id =&gt; [10, 15, 17]}.each do |row|
   ...
end

# inserindo uma rocha
DB[:rocks].insert(:name =&gt; &#039;Quartzo&#039;)
}}}

Conclusão: mal comecei a aprender o ActiveRecord, que me parecia o melhor dos melhores, e encontro algo melhor ainda! (De fato, eu gostei tanto que nem terminei de ler aquela comparação: eu precisava redigir este post!)

Muito legal a comunidade do Ruby oferecer recursos como esses! É um grande atrativo para novos usuários. :-D</texto>
    <publico>1</publico>
    <original>0</original>
    <anterior>0</anterior>
    <versao>0</versao>
    <traducao>0</traducao>
    <propriedade>
      <nome>linguagem</nome>
      <valor>sql</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>linguagem</nome>
      <valor>ruby</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>categ</nome>
      <valor>list</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>categ</nome>
      <valor>dicas</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>área</nome>
      <valor>informática</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>assunto</nome>
      <valor>Banco de Dados</valor>
      <publico>1</publico>
    </propriedade>
  </documento>
</elementos_gw>
