Carlos Brando

Nome do Jogo

Edge Rails: Escopos Dinâmicos

Finders dinâmicos não são mais novidades no Ruby on Rails há muito tempo, qualquer um que já tenha trabalhado em um simples projeto Rails, já fez algo assim:

User.find_by_first_name_and_age('Pedro', 20)

Sabemos que o método acima não existe, mas graças aos finders dinâmicos podemos usá-lo para recuperar todos os usuários que tenham como primeiro nome ‘Pedro’ e 20 anos de idade.

Outro recurso, um pouco mais novo, que também tem se mostrado muito útil são os named scopes. Com este recurso podemos definir um escopo como base para uma pesquisa. Por exemplo:

class Article < ActiveRecord::Base
  named_scope :published, :conditions => { :published => true }
end

Article.published.all :limit => 5

No exemplo acima estou usando o escopo published que ajustará minha pesquisa para que apenas artigos publicados sejam devolvidos, mas acrescentando o método all também posso limitar a quantidade de artigos retornados em cinco. Este tipo de flexibilidade não é possível em finders dinâmicos.

Para resolver esta deficiência foi adicionado um novo recurso ao Rails chamado dynamic scopes (escopos dinâmicos). Imagine esta funcionalidade como uma mistura dos dois conceitos que acabamos de ver.

Agora você poderá criar escopos de forma dinâmica, da mesma forma como já fazíamos através do find_by. Desta forma:

User.scoped_by_first_name_and_age 'Pedro', 20

Mas com a vantagem de poder usar toda a flexibilidade de um escopo:

User.scoped_by_first_name_and_age('Pedro', 20).all(:limit => 5)

Da mesma forma como fazíamos em escopos comuns, também podemos preceder um escopo com outro escopo:

User.scoped_by_first_name('Pedro').scoped_by_age(20)

Enfim, mais um grande ganho à nossa produtividade.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.

Comments