December 2, 2011
Ordenando documentos embutidos no mongodb

Fala galera! Precisei recentemente fazer um ordenação de um documento embutido no mongodb utilizando a gem mongoid

Imagine a estrutura a seguir:

user.rb

class User
  include Mongoid::Document
  field :name, :type => String,  :index => true
  embeds_many :lists
end

list.rb

class List
  include Mongoid::Document
  field :name, :type => String, :index => true
  embedded_in :user
  embeds_many :items
end

item.rb

class Item
  include Mongoid::Document
  field :name, :type => String, :index => true
  field :price, :type => Float
  embedded_in :list
end

Read More


September 21, 2011
Trabalhando com tarefas em background usando o resque

Fala galera! Vou escrever um pouquinho sobre um recurso muito bacana e ao mesmo tempo muito importante, que é o de trabalhar com tarefas em background.

Cenário

Como exemplo para nosso post, iremos adotar o envio de e-mail em massa, ok? Onde o usuário ao clicar em “disparar e-mails” será disparado cerca de 1000 e-mails.

NOTA: Não irei abordar a aplicação como um todo, irei focar somente no método do envio de e-mail no modelo de mensagem, até porque é o que mais nos interessa.

Problema

Imagine o momento que o usuário clicar em “disparar e-mails”… Dependendo da quantidade disparada, o usuário pode não ter uma experiência muito boa em seu site, pois o mesmo terá de esperar até o final da execução da tarefa. E como todos nós sabemos que alguns usuário são um pouco impacientes(Eu), o que pode acontecer para piorar? Isso mesmo! Ele irá tentar 1000.times { puts “novamente…” } achando que a ação não esta acontecendo.

Solução

Existem outras ferramentas para nos ajudar a resolver este problema, mas neste post irei abordar o resque.

A implementação do resque é bem simples, vamos lá?

Read More


July 21, 2011
Rvm, Ruby e ImageMagick no Lion

Se você não se conteve e atualizou seu Mac OS X para a nova versão lion antes de seus amigos cobaias, acredito que tenha tido alguns probleminhas com o rvm, ruby e ImageMagick, acertei? Claro que acertei! eu fui uma coabia… :(

Para poupar sua navegação ao google, irei facilitar um pouco como resolver esses problemas, vamos lá?

OBS: Todo o passo a passo abaixo estarei me baseando que você não tenha instalado o rvm, ruby e o ImageMagick.

Git

Assim que eu instalei o meu lion, tive problemas com o git, caso você tenha o mesmo problema, basta reinstalar baixando um .dmg:

http://code.google.com/p/git-osx-installer/downloads/list?can=3

Rvm

Vamos agora instalar o rvm. No terminal entre com o comando:

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

Read More


July 19, 2011
Chega de “RAILS_ENV=production”!!

rake db:migrate RAILS_ENV=production
rails c production

Nossa.. como é chato ter que especificar o ambiente de produção a cada comando executado em nosso servidor…

Será que podemos fazer algo para automatizar isso? Infelizmente não… teremos que conviver com isso pra sempre…

Brincadeira! Sempre tem algo que possamos fazer! E vamos ver agora!

Para isso, em nosso servidor de produção, basta adicionar o código abaixo no arquivo ”~/.bashrc”.

export RAILS_ENV='production'

Somente isso! Da para acreditar? Agora podemos rodar nosso comandos prediletos assim:

rake db:migrate
rails c

Bem legal né?

É isso ai pessoal, abraços!


July 14, 2011
Pesquisando dentro de um array

Saindo uma dica bem fresquinha sobre como pesquisar dentro de um array!

Imagine a seguinte situação:

@users = User.all(:conditions => ["country = ?", params[:country]])

Imagine que diante do resultado obtido em @users, precisemos filtrar por usuários que morem no Estado do Rio de Janeiro. Sabemos que isso pode ser feito apenas adicionando mais uma condição como a de country ao carregar os usuários… só estou usando como exemplo, não vá me trazer todos os usuários do banco de dados e filtrar depois, ok?

Bem, iremos utilizar o método select para fazer o filtro:

@users.select { |user| user.state == "Rio de Janeiro" }

Pronto! Molezinha né?

Abraços!


July 13, 2011
Construindo um sistema de autorização de usuário com herança

Que tal construir um sistema simples e funcional de autorização de usuários de forma rápida e bem elegante?

Lembrando: Quando falamos em autorização, estamos nos referindo as permissões dos usuários, o que cada tipo de usuário pode fazer ou não.

Acredito que a maioria das pessoas quando estudou orientação a objetos, teve como exemplo uma classe Cachorro que herda de uma classe Animal, certo? Vamos relembrar exemplo?

Relembrando

Classe Animal

class Animal
  def comer
    ...
  end
end

Aqui temos uma classe Animal que possui um método comer.

Classe Cachorro

class Cachorro < Animal
  def latir
    ...
  end
end

Já aqui, temos uma classe Cachorro que herda tudo de Animal, inclusive o método comer. Sendo que a classe Cachorro possui um método único que não esta disponível na classe Animal, o método o latir, pois não queremos que todos que herdarem de Animal tenham o método latir, certo? Imaginem um gato latindo… hmm seria meio estranho isso… enfim, continuando…

Read More


July 12, 2011
NoSql - O que é? Porque usar? Quando usar?

Vídeo

NoSQL Databases: What, Why and When - Lorenzo Alberton from PHP UK Conference on Vimeo.

Slide da apresentação

NoSQL Databases: Why, what and when View more presentations from Lorenzo Alberton


July 12, 2011
Sim! Os “caches” são mágicos!

O problema

O que fazer quando nossa aplicação começa a demorar a responder?

  1. Otimizar o código?
  2. Rever os índices do banco?
  3. Aumentar a memória? 
  4. Contratar um novo servidor?
  5. Escalar minha aplicação?

Logicamente todas as opções são válidas, porém existem uma que pode nos surpreender, o uso de caches! O rails possui nativamente esse recurso, porque não usa-lo?

Tipos de caches

Podemos trabalhar com três tipos de caches:

  1. Page cache
  2. Action cache
  3. Fragment cache

Porém hoje irei abordar somente o fragment cache, acredito ser o mais utilizado. Mas aconselho a conferirem os outros tipos também na documentação do rails.

Para quem não sabe, fragment cache nada mais é que guardar um pedaço de html, para que quando alguém acessar sua página, a aplicação não tenha que ir novamente ao banco de dados, coletar os dados e renderizar-lo em html. Funciona assim:

Read More


July 11, 2011
Find or create by …

Digamos que queremos procurar um usuário pelo seu e-mail e exibir seu nome, mas se esse usuário não existir, teremos que criá-lo.

Uma maneira de fazer isso seria:

@user = User.find_by_email("user@email.com")
unless @user
  @user User.create(:email => "user@email.com", :name => "User")
end
puts @user.name

Porém, podemos melhorar usando o find_or_create_by_email:

@user = User.find_or_create_by_email("user@email.com", :name => "User")
  puts @user.name

Podemos adicionar também mais condições neste método apenas incrementando com and, por exemplo:

@user = User.find_or_create_by_email_and_name("user@email.com", "User", :description => "Olá")
  puts @user.name

Legal né?


Liked posts on Tumblr: More liked posts »