Às vezes precisamos realizar consultas que não pertencem a nenhum modelo no Rails. Uma maneira de fazer isso é utilizando o método execute. Veja um exemplo:

# setting a variable
# with the current connection
conn = ActiveRecord::Base.connection

result = conn.execute "SELECT id, email FROM users LIMIT 3"
# => #<Mysql::Result>

Como resultado, você recebe um objeto Mysql::Result, que pode ser iterado da seguinte maneira:

result = conn.execute "SELECT id, email FROM users LIMIT 2"
result.each do |user|
  puts "id: %s" % user[0]
  puts "email: %s" % user[1]
  puts
end

Normalmente, precisamos fazer consultas baseadas em valores passados pelo usuário. É extremamente importante que você tome os cuidados necessários para não sofrer um ataque através de SQL Injection. Para que isto não aconteça, você deve utilizar o método quote:

query = "SELECT id, email FROM users WHERE email = %s" % conn.quote("' OR 1=1 #")
puts query
# => SELECT id, email FROM users WHERE email = '\' OR 1=1 #'

Além do método execute, você pode utilizar outros mais específicos como é o caso do método select_all. Este método retorna um array de hashes, com o nome das colunas como índice, tornando mais simples a iteração.

result = conn.select_all "SELECT id, email FROM users LIMIT 2"
result.each do |user|
  puts "id: %s" % user['id']
  puts "email: %s" % user['email']
  puts
end

Para os casos em que tudo o que você precisa é de apenas uma linha como resultado, você pode utilizar o método select_one:

result = conn.select_one("SELECT COUNT(*) AS total FROM users")
puts result['total']

No Rails, todos os modelos estendem a classe ActiveRecord::Base. Por isso, os métodos acima também estão disponíveis no modelo.

class User < ActiveRecord::Base
  def self.all
    connection.select_all "SELECT id, email FROM users"
  end
end
 
puts User.all
# => [{"id"=>"1", "email"=>"user@example.com"}, {"id"=>"2", "email"=>"another@example.com"}]

Lembre-se que não é nenhuma vergonha utilizar SQL diretamente no Rails. O que o ActiveRecord faz é nos poupar das tarefas rotineiras. Já para as mais complexas, você provavelmente vai precisar de uma das soluções acima. Para mais informações, acesse a documentação do ActiveRecord.

Comentários #

#1 Carlos Brando disse:
23 Ago 07, 08:19PM

Excelente post. Muito útil.

#2 Tiago Albineli Motta disse:
23 Ago 07, 10:59PM

Ótima dica, devidamente adicionada a meu delicious

#3 Rodrigo Urubatan disse:
09 Set 07, 08:10PM

Valeus, acabou e resolver o meu problema :D

#4 Simples Idéias. Por Nando Vieira. » Arquivo » Dica r... disse:
28 Jan 09, 07:59AM

[...] artigo Executando SQL no Rails mostrei como trabalhar com SQL no ActiveRecord. Para sanitizar parâmetros da query, utilizei o [...]

#5 Fernando disse:
25 Maio 09, 10:07PM

Valeu, era isso que estava procurando ;)

#6 José Torpedo Grátis disse:
10 Nov 09, 12:09PM

Legal! Resolveu o que eu precisava também em SQL. Valeu.

Deixe um comentário





Não é aceito código HTML: adicione-o no pastie.org ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.

jQuery: Dominando o framework

Você quer aprender a usar jQuery de verdade? Então chegou a hora! Neste workshop você verá como funciona este framework de JavaScript, entendendo todos os aspectos que fazem do jQuery uma das melhores ferramentas para desenvolvimento de interfaces.

Saiba mais Fechar

Conheça também o HOWTO