2012-05-18 2 views

답변

20

나는이 문제가 있었과는 일 반복 할 수 있도록 솔루션 "TO_DATE"를 추가했다 아래 @echristopherson 코멘트를 확인 할 것, like :

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

이 문제가 해결되었습니다. 감사합니다. Flaviu – sadaf

4

나는 귀하의 문제는 created_at = ?, time_range이고, time_range는 특정 값이 아니며 an =은 특정 값을 기대한다고 생각합니다. 그 이유에 대해 정확히 설명 할 수는 없지만 해결책을 얻을 수는 있습니다.

나는 그것을 시도 대신에이 작업을 수행하고 작동 큰

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

직접 질문과 관련,하지만 당신은 의미 론적 의미와 범위에 그 조건을 배치해야 그리 당신은 Feed.from_last_month과 비슷한 것을 가질 것입니다. Feed.not_with_ids([1,2,3])

귀하의 경우 스피 당신이 경고에 대한 설명은

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

+0

레일즈는': created_at =>'을 사용할 때'Range'를 언팩하기에 충분히 똑똑 할 수 있습니까?'created_at'가 원시 SQL의 일부일 때가 아닙니까? – echristopherson

+0

첫 번째 경우에는 Rails가 마법을 사용하도록하고, 두 번째 방법은 쿼리에 무엇을 넣을지를 명시하는 것입니다.) Rails가 자신의 이익을 위해 자신의 마술을하도록하십시오. –

+3

경고의 기본 이유는'Range's의 반복은'# succ '를 사용하여 매번 다음 항목에 도달한다는 것입니다. Ruby 1.9.2에서 시작하기'Time # succ'는 실제 시간에는 분리 된 후계자가 없기 때문에 쓸모없는 것으로 표시되었습니다. 1.9.2 이전 구현은 방금 초를 시간으로 나누는 임의의 규칙을 사용했습니다. 이것은 Rails가 여기에서하려고하는'Array'에'Range'를 언팩 할 때 작용합니다. – echristopherson