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.
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 'nomedojogo'.humanize
ActiveSupport::Inflector.inflections do |inflect|
inflect.human(/_cnt$/i, '\1_count')
inflect.human('nomedojogo', 'Nome do Jogo')
end
'jargon_cnt'.humanize 'nomedojogo'.humanize
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.third array.fourth array.fifth array.sixth array.seventh array.eighth array.ninth array.tenth
Minha opinião? Total falta do que fazer…
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
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.
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 }
>> x.many?
>> x.many? { |y| y == 'a' }
>> x.many? { |y| y == 'b' }
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.