2012-05-18 15 views
8

Bu hata neyle ilgili? Standart bir sorgu çalıştırıyorum şu şekilde:uyarı: Zaman # succ geçersizdir; zaman kullan + 1

time_range = (1.month.ago.beginning_of_month..1.month.ago.end_of_month) 


Feed.find(:all, :conditions => ['created_at = ? AND id not in (?)', time_range, [1,2,3]]).count 

Herhangi bir fikir var mı? Teşekkürler

+0

Ruby ve Rails'in hangi sürümleri? – echristopherson

cevap

20

bu sorunu vardı ve günler üzerinde dolaşır, böylece çözümün "TO_DATE" eklemek oldu altında @echristopherson yorumu kontrol yapacağını, öyleyse:

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

Bu, sorunumu çözdü. Teşekkürler Flaviu – sadaf

4

Sorununuzu created_at = ?, time_range yapıyor olduğunuzu ve time_range özel bir değer olmadığını ve = belirli bir değeri beklediğini düşünüyorum. Bu hatanın nedenini tam olarak açıklayamıyorum, ancak size bir çözüm getirebilir.

ben denedim yerine bunu yapın ve büyük çalışır

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 

GÜNCELLEME

doğrudan söz ilişkin, ancak semantik anlam kapsamları içinde bu koşulları koymanız gerekir O kadar Feed.from_last_month ve Feed.not_with_ids([1,2,3])

gibi bir şey olurdu. ry Eğer Uyarı hakkında açıklama için

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

+0

Mümkün mü? Rails, ': created_at =>' kullanırken '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' 'kutusunu açmak için yeterince akıllıdır, ancak' created_at 'ham SQL'in bir parçası olduğunda değil midir? – echristopherson

+0

Bu, ilk durumda, Rails'in sihrini yapmasına izin verirsin, ikinci şekilde sorguda ne yapılacağını açık bir şekilde söylüyorsun;) Rails'in sihrini kendi iyiliğin için yapsın. –

+3

Uyarının temel nedeni, Range'in her seferinde bir sonraki öğeye ulaşmak için '# succ' işlevini kullandığı yinelemedir; ve Ruby 1.9.2 'den başlayarak“ Time # succ ”eskiydi; çünkü gerçek zamanın ayrık bir halefi yok; 1.9.2 öncesi uygulama, sadece bölme süresinin saniye cinsinden keyfi kuralını kullanmıştır. Bu, Rails'in burada yapmaya çalıştığı bir 'Range'i bir' Array 'haline getirirken devreye giriyor. – echristopherson

İlgili konular