Por Carlos Brando em 14 de Novembro de 2008
No Rails 2.2 você poderá definir atributos do ActiveRecord como private. Como estes atributos são criados via metaprogramação, até agora isto era impossível.
Para entender como isto funcionará, vamos tornar o atributo name da classe User privado:
class User < ActiveRecord::Base
private
def name
“I’m private”
end
end
Agora ao tentar recuperar o [...]
Por Carlos Brando em 07 de Novembro de 2008
Para tornar o ActiveRecord mais consistente foi adicionado o método de instância Model#delete. Ele é similar ao método de classe com o mesmo nome. O método delete, diferente do método destroy, apaga o registro do banco de dados sem disparar callbacks, como o before_destroy e o after_destroy.
Este método também não aplicará nenhuma das regras impostas [...]
Por Carlos Brando em 30 de Outubro de 2008
Para entender esta alteração, vamos precisar analisar o mesmo código sendo executado em uma versão anterior do Rails e depois no Rails 2.2. Vamos pegar um modelo como exemplo:
class Comment < ActiveRecord::Base
alias_attribute :text, :body
end
Note que estou usando o método alias_attribute para criar um alias para o atributo body com o nome de text. [...]
Por Carlos Brando em 29 de Outubro de 2008
Não sei dizer se isto é um bug ou não, mas na minha opinião isto representa um problema. Veja o código abaixo, onde tento alterar a conta de um usuário usando sua foreign key em um projeto Rails 2.1 ou anterior:
class User < ActiveRecord::Base
belongs_to :account
end
user = User.first
# => #<User id: 1, login: “admin”, [...]
Por Carlos Brando em 26 de Outubro de 2008
O método composed_of recebeu duas novas opções: :constructor e :converter.
A opção :constructor pode receber um simbolo com o nome de um método ou um Proc. Por padrão, a classe de composição é criada através do método new, recebendo todos os atributos mapeadas como parâmetros, exatamente na ordem que em foram mapeados. Se por algum motivo [...]
Por Carlos Brando em 07 de Outubro de 2008
Aumentando o número de finders dinâmicos do ActiveRecord, agora temos o find_last_by. Já tinhamos os famosos find_by e o find_all_by.
Além de simplificar, ficou muito mais elegante recuperar o último comentário feito por um usuário, por exemplo. Veja:
Comment.find_last_by_author(”Carlos Brando”)
Este artigo pertence a série “Edge Rails”. Todos os exemplos dados aqui funcionarão somente no Ruby on Rails [...]
Por Carlos Brando em 06 de Outubro de 2008
Todas as mensagens de log que continham uma indicação do tempo que determinado processo levou para ser executado, foram alteradas para exibir o tempo em milisegundos.
Por exemplo, a mensagem:
Completed in 0.10000 (4 reqs/sec) | Rendering: 0.04000 (40%) | DB: 0.00400 (4%) | 200 OK [http://example.com]
Agora será exibida da seguinte forma:
Completed in 100ms (View: 40, DB: [...]
Por Carlos Brando em 02 de Outubro de 2008
Se você tiver dois modelos: Post e Comment. Onde Post tem muitos (has_many) comentários. Se você executar:
Post.first.comment_ids
O Rails usará a seguinte query para recuperar os ids:
SELECT * FROM `comments` WHERE (`comments`.post_id = 1)
Mas neste caso, não precisamos dos objetos inteiros. A seguinte query seria mais do que suficiente para o funcionamento deste método, além de [...]
Por Carlos Brando em 28 de Setembro de 2008
Existe um bug no método count do ActiveRecord quando usamos uma associação has_many em conjunto com a opção :limit ou :offset. Vejamos um exemplo:
class Post < ActiveRecord::Base
has_many :comments, :limit=> 2
end
No código acima quando tentarmos recuperar os comentários de um post, apenas 2 comentários devem ser retornados.
post.comments.length # => 2
# Veja o SQL usado:
# [...]
Por Carlos Brando em 27 de Setembro de 2008
Digamos que temos a seguinte associação has_many :through:
class Author < ActiveRecord::Base
has_many :authorships
has_many :books, :through => :authorships
end
Ao procurar por um livro você pode incluir a autoria em sua busca:
author.books.find(:all, :include => :authorships,
:conditions => ["authorships.primary [...]
Por Carlos Brando em 25 de Setembro de 2008
Os métodos dinâmicos de pesquisa do ActiveRecord receberam uma versão destrutiva, que dispara um erro do tipo RecordNotFound caso nenhum registro seja encontrado, ao invés de apenas retornar nil como acontece com a versão original.
Para usar esta versão destrutiva, basta adicionar o sinal de exclamação no final do método. Veja um exemplo:
Topic.find_by_title!(”The First Topic!”)
# => [...]
Por Carlos Brando em 23 de Setembro de 2008
Lembra-se destes dois artigos?
Edge Rails: Usando a opção :accessible para fazer atribuições em massa no ActiveRecord
Edge Rails: Fazendo uso da opção accessible em formulários
Pois bem, esqueça. Esta funcionalidade foi removida do Rails, pois não estava totalmente completa e não daria tempo de terminar tudo até o lançamento do Rails 2.2.
Provavelmente ela deve voltar no futuro, [...]
Por Carlos Brando em 18 de Setembro de 2008
Quando uma migration está em execução e um erro ocorre, tudo que já foi executado será aplicado ao banco de dados, mas tudo que estiver após o erro, não será aplicado. Além disso a migration será marcada como concluída. Isto pode dar uma certa dor de cabeça para corrigir.
Mas, se o banco de dados que [...]
Por Carlos Brando em 10 de Setembro de 2008
Quando você executa o método find_all em um named_scope o método não está sendo direcionado para o proxy_found conforme o esperado. Isto faz com que um erro NoMethodError seja retornado.
Topic.base.find_all(&:approved)
# => NoMethodError: undefined method `find_all’ for #<Class:0×19a0fb4>
Este problema pode ser contornado usando o método to_a:
Topic.base.to_a.find_all(&:approved)
# => [#<Reply:0x179e720>#<Topic:0x179e388>#<Reply:0x179e20c>]
Após o lançamento do Rails 2.2 não teremos mais [...]
Por Carlos Brando em 09 de Setembro de 2008
Algo que muita gente reclama sobre o Rails é que ele é lento. Sabemos que isto não é totalmente verdade, mas também sabemos que muita coisa pode ser feita para melhorar a performance dele.
Uma destas coisas acabou de se feita. Foi incluído ao Rails um Pool de Conexões com o banco de dados.
Toda vez que [...]
Por Carlos Brando em 05 de Setembro de 2008
Imagine que ao rodar uma série de migrations um determinado modelo seja renomeado. Agora imagine que antes disto acontecer uma outra migration faça referencia a este modelo. Isto causará um erro feio e parará a execução de suas migrations.
Para evitar este tipo de problema foi criado uma nova classe chamada MigrationProxy que armazena o nome, [...]
Por Carlos Brando em 13 de Agosto de 2008
Alguns de vocês já devem conhecer o método assert_queries que ajuda a validar nos testes a quantidade de queries executadas. Por exemplo:
assert_queries(Firm.partial_updates? ? 0 : 1) { firm.save! }
No teste acima estou afirmando que se houver partial_updates uma query deve ser executada no banco de dados, caso contrário nenhuma deve ser executada.
Agora ganhamos mais um [...]
Por Carlos Brando em 04 de Agosto de 2008
Uma nova opção foi acrescentado ao método has_many: a opção :primary_key.
Fazendo uso desta opção podemos definir qual método do modelo associado retornará a chave primária que será usada na associação. Obviamente o método padrão é o id.
Veja um exemplo de uso:
has_many :clients_using_primary_key, :class_name => ‘Client’,
:primary_key => ‘name’, :foreign_key => ‘firm_name’
Atualização
4 de agosto de [...]
Por Carlos Brando em 28 de Julho de 2008
Todos os métodos de associações do ActiveRecord (belongs_to, has_one, has_many e has_and_belongs_to_many) receberam um nova opção que permite a atribuição de valores para suas associações usando hashes aninhados.
Vamos pegar como exemplo um modelo chamado Post:
class Post < ActiveRecord::Base
belongs_to :author, :accessible => true
has_many :comments, :accessible => true
end
Note que logo após associar este [...]
Por Carlos Brando em 22 de Julho de 2008
À partir da próxima versão do Rails quando usarmos a opção :limit para colunas com números inteiros, em nossas migrations, estaremos nos referindo ao número de bytes, no MySQL e no PostgreSQL (no sqlite sempre foi assim).
O tipo da coluna no banco de dados dependerá da quantidade de bytes espeficida. Veja o trecho de código [...]
Por Carlos Brando em 21 de Julho de 2008
Algumas correções de bugs que sairão na próxima versão do Ruby on Rails:
ActiveRecord
Correção de uma colisão entre named_scope e :joins.
Quando se usava with_scope junto com :joins todos os atributos da tabelas secundárias eram adicionados ao modelo da tabela principal.
Partial updates não atualizavam o lock_version se nada foi alterado.
Quando usávamos optimistic locking com partial updates, tinhamos [...]
Por Carlos Brando em 15 de Julho de 2008
Ao realizar buscas no banco de dados, por vezes temos de fazer uso da opção :joins afim de melhorar a performance de nosso aplicativo, em outros casos precisamos simplesmente recuperar algum tipo de informação que depende do resultado de duas tabelas.
Por exemplo, se desejássemos recuperar todos os usuários do sistema que compraram itens da cor [...]
Por Carlos Brando em 09 de Julho de 2008
O método validates_length_of faz parte dos muitos métodos de validação contidos no ActiveRecord. Este método em particular serve para garantir que o valor gravado em uma determinada coluna no banco de dados terá um tamanho máximo, mínimo, exato, ou até mesmo se está em um intervalo de valores.
Mas o termo “tamanho” é relativo. Hoje quando [...]
Por Carlos Brando em 07 de Julho de 2008
Quando se usa o comando rake db:migrate:down VERSION=alguma_versão, os registros na tabela schema_migrations não estão sendo atualizados.
Isto significa que após usar o comando rake db:migrate:down ou up se você rodar o comando rake db:migrate algumas migrations podem não ser executadas. Vamos simular isto para ficar fácil de entender o problema:
$ ./script/generate migration test_migration
[...]
Por Carlos Brando em 04 de Julho de 2008
Esta alteração trata-se na verdade de uma correção de um bug no método rename_column. Para entender qual era o problema precisamos de um cenário como exemplo. Primeiro criamos um migration:
create_table “users”, :force => true do |t|
t.column :name, :string, :default => ”
end
Ok, agora criamos um segundo migration onde vamos renomear a coluna name da [...]