2012-05-18 17 views

Respuesta

20

he tenido este problema y la solución fue añadir "to_date" para que itera a través de los días, como tal:

time_range = (1.month.ago.beginning_of_month.to_date..1.month.ago.end_of_month.to_date) 
+0

Esto resolvió mi problema. Gracias Flaviu – sadaf

4

Creo que su problema es que usted está haciendo created_at = ?, time_range, y time_range no tiene un valor específico, y an = espera un valor específico. No puedo explicar exactamente el porqué de ese error, pero puedo darte una solución.

hacer esto en su lugar, lo probé y funciona muy bien

1.9.3-p125 :014 > time_range = (1.month.ago.beginning_of_month..1.month.ago.end_of_month) 
=> Sun, 01 Apr 2012 00:00:00 UTC +00:00..Mon, 30 Apr 2012 23:59:59 UTC +00:00 
1.9.3-p125 :015 > Post.where(:created_at => time_range).where('id not in (?)', [1,2,3]).count 
    (0.3ms) SELECT COUNT(*) FROM "posts" WHERE ("posts"."created_at" BETWEEN '2012-04-01 00:00:00.000000' AND '2012-04-30 23:59:59.999999') AND (id not in (1,2,3)) 
=> 0 

ACTUALIZACIÓN

no directamente relacionados con la cuestión, pero se debe colocar esas condiciones en ámbitos con significado semántico por lo tendrías Feed.from_last_month y algo así como Feed.not_with_ids([1,2,3])

Y para tu que ry que haría

Feed.from_month.not_with_ids([1,2,3]).count 

Para una explicación acerca de la advertencia comprobar el comentario a continuación @echristopherson

+0

¿Es posible que Rails sea lo suficientemente inteligente como para descomprimir 'Range's cuando usa': created_at => ', pero no cuando' created_at' es parte de SQL sin formato? – echristopherson

+0

Así es, en el primer caso dejas que Rails haga su magia, en la segunda forma eres explícito diciendo qué colocar en la consulta;) Deja que Rails haga su magia por tu propio bien. –

+3

La razón de base para la advertencia es que la iteración sobre 'Range's usa' # succ' para llegar al siguiente elemento cada vez; y comenzando en Ruby 1.9.2 'Time # succ' se marcó como obsoleto porque un tiempo verdadero realmente no tiene un sucesor discreto; la implementación anterior a la 1.9.2 simplemente usó la convención arbitraria de dividir el tiempo en segundos. Esto entra en juego al desempaquetar un 'Range' en un' Array', que es lo que Rails intenta hacer aquí. – echristopherson