Comparação com campo counter_cache

7 views
Skip to first unread message

CamilaLM

unread,
Nov 12, 2009, 3:59:40 PM11/12/09
to rails-br
Boa tarde pessoal,

alguém sabe me informar se existe alguma maneira de comparar um campo
do "tipo" counter_cache?

segue um trecho de código para identificar meu problema:

>> modelo = Modelo.first(:select => "id, emplacamentos_count")
=> #<Modelo id: 149535, emplacamentos_count: 0>
>> modelo.emplacamentos_count == 0
=> false
>> modelo.emplacamentos_count.class
=> NilClass


PS: Desculpem se estou repetindo a discussão mas procurei vagamente
nas passadas e não encontrei nada parecido.

Maurício Linhares

unread,
Nov 12, 2009, 4:02:41 PM11/12/09
to rail...@googlegroups.com
Faça só:

modelo = Modelo.first
modelo.emplacamentos_count == 0
modelo.emplacamentos_count.class

E deve funcionar. Não coloque o :select.

-
Maurício Linhares
http://codeshooter.wordpress.com/ | http://twitter.com/mauriciojr



2009/11/12 CamilaLM <cami...@gmail.com>:

G. Sobrinho

unread,
Nov 12, 2009, 4:03:40 PM11/12/09
to rail...@googlegroups.com
Você pode definir no seu banco que o valor default é 0 mas também pode olhar com o .empty?

2009/11/12 CamilaLM <cami...@gmail.com>



--
Cordialmente,

Gabriel Sobrinho
Diretor de desenvolvimento

Hite - Comunicação Digital e Mídia Interativa
http://www.hite.com.br/

+55 31 8775 8378

Rodrigo Pinto

unread,
Nov 12, 2009, 7:42:47 PM11/12/09
to rail...@googlegroups.com


2009/11/12 CamilaLM <cami...@gmail.com>


Boa tarde pessoal,

alguém sabe me informar se existe alguma maneira de comparar um campo
do "tipo" counter_cache?

segue um trecho de código para identificar meu problema:

>> modelo = Modelo.first(:select => "id, emplacamentos_count")
=> #<Modelo id: 149535, emplacamentos_count: 0>
>> modelo.emplacamentos_count == 0
=> false
>> modelo.emplacamentos_count.class
=> NilClass

Utilize o próprio relacionamentos que ele ja utilizara a coluna de counter cache:
i.e.:

modelo = Modelo.first
modelo.emplacamentos.size == 0

funcionará.

nesse caso ele já estará fazendo uso da coluna de counter cache.



PS: Desculpem se estou repetindo a discussão mas procurei vagamente
nas passadas e não encontrei nada parecido.


Abraços.

--
Rodrigo Pinto
"Usar software livre é igual a usar uma cirola. Me deixa com a mesma sensação de liberdade."

Camila Lombardi Michelini

unread,
Nov 12, 2009, 8:13:57 PM11/12/09
to rail...@googlegroups.com
Boa noite pessoal,

obrigada pelas opções.

@Mauricio eu originalmente tinha feito o find sem :select e o comportamento é igual, fiz com :select apenas para não poluir com informações desnecessárias e ficar mais claro na hora de explicar minha dúvida.

@Sobrinho o default desse campo já está como 0, eu gostaria de fazer a comparação pq em algum momento vou ter que fazer um decrement_counter mas não quero que o valor fique negativo. .empty? não sei se vai funcionar pq ele retorna um NilClass, e não quero utilizar do relacionamento para contar registros.

@Rodrigo o counter_cache veio como opção para evitar a consulta pq a tabela emplacamentos tem milhões de registros. Incrementar e decremetar o contador fica mais simples que consultar na tabela.


Rodrigo Pinto

unread,
Nov 12, 2009, 8:30:23 PM11/12/09
to rail...@googlegroups.com


2009/11/12 Camila Lombardi Michelini <cami...@gmail.com>

Eu sei disso, o que quero dizer que quando vc não possui counter cache o rails fará assim:

 select count(*) bla bla bla

e quando vc possui a coluna de counter cache o rails não fará select e sim usar o valor da coluna (counter_column) .

por isso eu disse para fazer modelo.emplacamentos.size

 




Camila Lombardi Michelini

unread,
Nov 12, 2009, 8:37:10 PM11/12/09
to rail...@googlegroups.com
@Rodrigo exatamente, o counter_cache não fará uma consulta, pois é um atributo do próprio objeto. Mas modelo.emplacamentos.size qus vc sugestionou não irá disparar uma query através do relacionamento? Isso que estou tentando evitar. 

Rodrigo Pinto

unread,
Nov 12, 2009, 8:41:52 PM11/12/09
to rail...@googlegroups.com
2009/11/12 Camila Lombardi Michelini <cami...@gmail.com>
@Rodrigo exatamente, o counter_cache não fará uma consulta, pois é um atributo do próprio objeto. Mas modelo.emplacamentos.size qus vc sugestionou não irá disparar uma query através do relacionamento? Isso que estou tentando evitar. 


Não se vc tiver implementado o counter_cache... .
O COUNTER_CACHE serve exatamente para não disparar toda hora a consulta o RAILS faz a mágica...


Vc já tentou ? olho no console para ver se ele continua disparando o sql ?



não digo 100% mas acho que estou 99% quase de certeza em relação a isto implementei dois desse essa semana para ganhar performance..

se vc der uma olhada nos docs e procurar counter-cache no railscast verá ..

Abraços


Camila Lombardi Michelini

unread,
Nov 12, 2009, 8:49:23 PM11/12/09
to rail...@googlegroups.com
@Rodrigo certo, vou tentar sua sugestão amanhã e já estou buscando informações sobre o uso do counter_cache, na verdade essa é a primeira vez que uso counter_cache, por isso vou verificar se alguma coisa não está mal definida. E por isso perguntei quanto ao disparo da query amanhã terei a resposta.

Mas a dúvida inicial ainda é como comparar o valor de um "atributo" counter_cache se ele retorna um NilClass? Será que é proposital esse retorno, ou é algum erro de má configuração?

Maurício Linhares

unread,
Nov 12, 2009, 8:50:50 PM11/12/09
to rail...@googlegroups.com
Será que você não esqueceu de definir o default da coluna pra zero?

Se você não define o default pra zero ele fica como sendo NULL no banco.
2009/11/12 Camila Lombardi Michelini <cami...@gmail.com>:

Rodrigo Pinto

unread,
Nov 12, 2009, 8:52:46 PM11/12/09
to rail...@googlegroups.com
O que qualquer coisa poste na lista amanhã, mas de uma olhada na sugestão do Maurício Linhares, pois acho que pode ter alguma coisa haver.

Abraços.

2009/11/12 Camila Lombardi Michelini <cami...@gmail.com>
@Rodrigo certo, vou tentar sua sugestão amanhã e já estou buscando informações sobre o uso do counter_cache, na verdade essa é a primeira vez que uso counter_cache, por isso vou verificar se alguma coisa não está mal definida. E por isso perguntei quanto ao disparo da query amanhã terei a resposta.


Mas a dúvida inicial ainda é como comparar o valor de um "atributo" counter_cache se ele retorna um NilClass? Será que é proposital esse retorno, ou é algum erro de má configuração?



Camila Lombardi Michelini

unread,
Nov 13, 2009, 6:13:01 AM11/13/09
to rail...@googlegroups.com
@Rodrigo acabei de testar a sua sugestão (modelo.emplacamentos.size) e realmente não dispara uma query e retorna o valor de emplacamentos_count, resolvendo meu problema.

Obrigada!! :D


Reply all
Reply to author
Forward
0 new messages