Skip to content
dezembro 1, 2008 / cassiomarques

Booleanize: Plugin para facilitar o trabalho com atributos booleanos com Active Record

Escrevi um pequeno plugin chamado Booleanize, que facilita um pouco nossa vida para trabalhar com atributos booleanos nos nossos models Active Record. Ou melhor, facilitou a minha vida, por isso escrevi o plugin. Espero que facilite a vida de mais alguém também!

Em alguns projetos eu preciso usar atributos do tipo boolean em diversos models e isso acaba duplicando código em várias lugares. O Booleanize resolve um pouco desse problema, criando 4 novos métodos, sendo dois de instância e dois named scopes.

Métodos de instância

Suponha que você possui um atributo booleano chamado active dentro de um model User. Se você passar o nome deste atributo na forma de um symbol para o método booleanize, dois novos métodos de instância serão criados:

  • active? – Informa se o valor do atributo é true ou false. Caso o atributo seja nil, será retornado false.
  • active_humanize – Retorna uma string representando true ou uma string representando false.
class User < ActiveRecord::Base
  booleanize :active
end

u = User.new(:active => true)
u.active? #=> true
u.active_humanize #=> "True"
u.active = false
u.active_humanize #=> "False"
u.active? #=> false

Você também pode especificar quais strings o Booleanize deve usar para os valores true ou false, passando um array de três elementos com o formato [:attr_name, “string para true”, “string para false”].

class User < ActiveRecord::Base
  booleanize &#91;:active, "Yes", "No"&#93;
end

u = User.new(:active => true)
u.active_humanize #=> "Yes"

Named scopes

O Booleanize criará dois novos named_scope para cada atributo recebido. Usando novamente o exemplo dado acima, teremos:

  • active – Retornará todos os objetos para os quais o atributo booleano active for true. É equivalente a escrever:
      named_scope :active, :conditions => {:active => true}  
      
  • not_active – Retornará todos os objetos para os quais o atributo booleano active for false. É equivalente a escrever:
      named_scope :not_active, :conditions => {:active => false}
      

Múltiplos atributos de uma única vez

Você pode passar vários parâmetros para o método booleanize de uma única vez, tanto na forma de um symbol como na forma de um array de três elementos

class User < ActiveRecord::Base
  booleanize :active, &#91;:smart, "Yes!", "No, dumb"&#93;, :friend
end
&#91;/source&#93;
  
<h3>Resumo</h3>
É simples: Ao invés de ter que escrever


class User < ActiveRecord::Base
  named_scope :active, :conditions => {:active => true}
  named_scope :not_active, :conditions => {:active => false}

  def active_humanize
    active ? "Yes" : "No"
  end

  def active?
    active ? true : false  #=> because we'll always want it to return true or false, and never nil.
  end
end

você pode escrever apenas

class User < ActiveRecord::Base booleanize [:active, "Yes", "No"] end [/source]

Instalação

Basta usar o GIT e clonar o plugin dentro da pasta vendor/plugins da sua aplicação Rails. A partir de sua aplicação, faça

git clone git://github.com/cassiomarques/booleanize.git vendor/plugins/booleanize

e pronto.

Testes

O Booleanize possui muitos testes unitários, escritos com o RSpec, para garantir seu correto funcionamento. Caso queira executar estes testes, dê uma olhada no README do projeto no GitHub.

5 Comentários

Deixe um comentário
  1. Éverton Ribeiro / dez 5 2008 6:20 pm

    Cássio, parabéns pelo plugin, muito bom e muito útil, já aproveitei o código e atualizei meu plugin para não depender da aplicação rails para os testes, muito boa a sacada de deixar a criação da tabela de teste em um arquivo separado.

  2. Guilherme Garnier / dez 18 2008 3:21 pm

    Cássio, há um erro no primeiro código de exemplo. As linhas 7 e 8 estão invertidas.

  3. cassiomarques / dez 18 2008 3:28 pm

    Obrigado Guilherme, erro corrigido.

  4. fernandoluizao / jan 21 2009 2:49 pm

    Cássio, após a versão 2.0 do Rails, acho que os atributos booleanos automaticamente ganham um método com “?”. Dê uma olhada nisso pois pode não ser preciso criar o método manualmente.

    []’s

  5. cassiomarques / jan 21 2009 2:53 pm

    @fernandoluizao,

    Sim é verdade! Mas como tem um monte de gente por ai que ainda tá usando o Rails 1.2.6 (pois é, eu sei…), deixei o suporte assim mesmo.

    Obrigado!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: