2012-05-18 2 views

Antwort

20

den @echristopherson Kommentar überprüfen hatte ich dieses Problem und die Lösung war „to_date“ hinzufügen, so dass es die Tage iteriert, wie folgt:

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

Das hat mein Problem gelöst. Danke Flaviu – sadaf

4

Ich denke, Ihr Problem ist, dass Sie created_at = ?, time_range tun, und time_range ist kein bestimmter Wert, und ein = erwartet einen bestimmten Wert. Kann den Grund für diesen Fehler nicht genau erklären, kann Ihnen aber eine Lösung bringen.

Tun Sie dies stattdessen ich es ausprobiert und funktioniert super

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 

UPDATE

nicht direkt auf die Frage bezogen, aber Sie sollten diese Bedingungen in Bereichen mit semantischer Bedeutung platzieren, so Sie hätten Feed.from_last_month und etwas wie Feed.not_with_ids([1,2,3])

Und für Ihre que ry Sie tun würden

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

Zur Erklärung über die Warnung unter

+0

Ist es möglich, dass Rails intelligent genug ist, 'Range' bei der Verwendung von' created_at => 'zu entpacken, aber nicht, wenn' created_at' Teil von Raw SQL ist? – echristopherson

+0

Das ist die Sache, im ersten Fall lässt du Rails seine Magie wirken, auf die zweite Weise sagst du explizit, was du in die Abfrage setzen sollst;) Lass Rails seine Magie zu deinem Besten tun. –

+3

Der Grund für die Warnung ist, dass die Iteration über 'Range' 'succ' verwendet, um jedes Mal das nächste Element zu erreichen. und starten in Ruby 1.9.2 'Time # succ' wurde als obsolet markiert, weil eine wahre Zeit wirklich keinen diskreten Nachfolger hat; Die Implementierung vor 1.9.2 verwendete einfach die willkürliche Konvention, die Zeit in Sekunden zu teilen. Dies kommt ins Spiel, wenn ein 'Range' in ein' Array' entpackt wird, was Rails hier versucht. – echristopherson