Edge Rails: Introduzindo Memoizable para cache de atributos 1

Publicado por Carlos Brando em 18 de Julho de 2008

Performance é coisa séria, e um dos métodos mais usados para aumentar a velocidade de execução em códigos é o uso de cache. Quem nunca fez algo assim?

class Person < ActiveRecord::Base
  def age
    @age ||= um_calculo_muito_complexo
  end
end

Na próxima versão do Rails teremos uma forma mais elegante de fazer isto usando o método memoize (é memoize mesmo e não memorize). Vamos alterar o exemplo acima para funcionar com esta nova funcionalidade:

class Person < ActiveRecord::Base
  def age
    um_calculo_muito_complexo
  end
  memoize :age
end

O método age será executado apenas uma vez e o seu retorno será armazenado e retornado em futuras chamadas ao método.

Só existe uma diferença entre os dois códigos acima. No primeiro, como o método é executado todas as vezes, se o valor armazenado na variável @age for nil ou false o cálculo (muito complexo) será executado novamente até termos a idade da pessoa.

No segundo exemplo, o método age só será executado uma vez e o valor retornado será sempre devolvido nas próximas chamadas, mesmo que seja nil ou false.

Edge Rails: Crie regras para o String#humanize 2

Publicado por Carlos Brando em 03 de Julho de 2008

Já faz um certo tempo que Pratik Naik está tentando colocar este patch no Rails e parece que finalmente conseguiu.

No arquivo config/initializers/inflections.rb você tem a opção de acrescentar novas inflexões para pluralização, singularização e outros:

Inflector.inflections do |inflect|
  inflect.plural /^(ox)$/i, '\1en'
  inflect.singular /^(ox)en/i, '\1'
  inflect.irregular 'person', 'people'
  inflect.uncountable %w( fish sheep )
end

Na próxima versão do Rails você também poderá incluir inflexões para o método humanize da classe String. Vamos aos famosos exemplos:

'jargon_cnt'.humanize # => "Jargon cnt"
'nomedojogo'.humanize # => "Nomedojogo"

ActiveSupport::Inflector.inflections do |inflect|
  inflect.human(/_cnt$/i, '\1_count')
  inflect.human('nomedojogo', 'Nome do Jogo')
end

'jargon_cnt'.humanize # => "Jargon count"
'nomedojogo'.humanize # => "Nome do jogo"

Edge Rails: Array#second até Array#tenth 11

Publicado por Carlos Brando em 02 de Julho de 2008

Que David Heinemeier Hansson (DHH) gosta de inventar coisas no Rails não é segredo para ninguém, mas algumas vezes ele meio que exagera um pouco. Veja por exemplo esta última adição que ele fez.

No objeto Array hoje já temos o método first e last, então porque não ter também os métodos second, third, fourth e assim por diante? É isso mesmo, ele acrescentou ao objeto Array os métodos que vão do second (segundo) até o tenth (décimo), que servem para retornar o objeto especifico dentro do Array (o terceiro objeto do array, por exemplo).

Vamos aos exemplos:

array = (1..10).to_a

array.second  # => array[1]
array.third   # => array[2]
array.fourth  # => array[3]
array.fifth   # => array[4]
array.sixth   # => array[5]
array.seventh # => array[6]
array.eighth  # => array[7]
array.ninth   # => array[8]
array.tenth   # => array[9]

Minha opinião? Total falta do que fazer…

Edge Rails: Nova sintax para testes 2

Publicado por Carlos Brando em 26 de Junho de 2008

No último podcast falamos que o DHH agora só quer saber de novidades, e realmente, toda vez que vejo um commit dele no Rails já vou correndo saber do que se trata, porque na maioria das vezes é algo novo.

Desta vez ele adicionou uma nova forma de se declarar testes, usando declarações test/do. Veja:

test "verify something" do
  # ...
end

Eu particularmente gosto mais deste jeito!

Esta é uma novidade importante porque à partir da próxima versão do Rails este será o padrão, veja como ficou um arquivo de teste unitário recém criado no edge rails:

require 'test_helper'

class PostTest < ActiveSupport::TestCase
  # Replace this with your real tests.
  test "the truth" do
    assert true
  end
end

A forma atual, usando métodos, também continuará funcionando, então nossos testes atuais não quebrarão.

Edge Rails: Enumerable#many? agora aceita blocos

Publicado por Carlos Brando em 20 de Junho de 2008

Eu já falei sobre este método many? há alguns dias atrás. Este método recebeu uma nova implementação permitindo que ele aceite blocos também, que funciona exatamente como o método any?.

Vamos aos exemplos:

>> x = %w{ a b c b c }
# => ["a", "b", "c", "b", "c"]

>> x.many?
# => true

>> x.many? { |y| y == 'a' }
# => false

>> x.many? { |y| y == 'b' }
# => true


# um outro exemplo...
people.many? { |p| p.age > 26 }

Apenas para relembrar e reforçar, este método só retornará true se mais de 1 objeto passar nas condições quando usado o bloco, e quando a coleção tiver mais de 1 objeto quando usado sem condicionais.