Sanitizando queries com ActiveRecord

28 de Janeiro de 2009

No artigo Executando SQL no Rails mostrei como trabalhar com SQL no ActiveRecord. Para sanitizar parâmetros da query, utilizei o método quote. O grande problema de utilizar este método é que se você tiver uma quantidade muito grande de parâmetros vai ser, como diz o Lucas Húngaro, um trabalho de presidiário!

O ActiveRecord possui um método protegido chamado sanitize_sql_array, que permite trabalhar com todas as interpolações de valores. Para utilizá-lo mais facilmente, basta fazer um monkey patch na classe ActiveRecord::Base.

class ActiveRecord::Base
  def self.sanitize_query(query, options)
    sanitize_sql_array([query, options])
  end
end

Agora, você pode utilizar queries desta maneira:

options = {:title => "Simples Idéias"}
sql = User.sanitize_query("select * from blogs where title = :title", options)
User.connection.execute(sql)

Comentários #

#1 Otávio Sampaio disse:
28 Jan 09, 12:05PM

Nando, legal. Você conhece o ryanb-scope-builder? Depois vou fazer um post sobre ele. O mais legal é que ele interpola named_scopes em runtime de forma condicional. Ou seja, você pode usar um filtro de busca do nome do usuário se o usuário preencher o filtro do nome e caso deixe em branco, não fazer.

O que é mais legal é que ele é mais facilmente testável e não lida com sql direto. Dá uma olhada. Não serve para tudo, mas estou usando para fazer filtros de busca em um novo projeto e, por enquanto, estou bem satisfeito.

abraços,

otávio

#2 jcz disse:
29 Jan 09, 01:29PM

Olá!
Vc sabe como posso chamar funções em oracle no ruby?
Por exemplo, eu tenho uma função de banco com esta chamada pelo pl/sql devel

begin
-- Call the function
:result := fnc_list_times(c_cur_ret => :c_cur_ret);
end;

ele me retorna um inteiro (result) e o c_cur_ret é um cursor ( dá pra dizer que é um array ) com os dados dos times.

Será que algúem pode me dar uma ajuda?

Valeu

Deixe um comentário




Este blog usa o Gravatar.


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.