2012-05-18 2 views
8

Что это за ошибка? Я выполняю стандартный запрос следующим образом:предупреждение: время # succ устарело; время использования + 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 

Любые идеи? Спасибо

+0

Какие версии Ruby и Rails? – echristopherson

ответ

20

Я имел эту проблему, и решение было добавить «TO_DATE», так что она перебирает дни, например:

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])

И для вашего que гу вы могли бы сделать

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

Для объяснения по поводу предупреждения проверьте @echristopherson комментарий ниже

+0

Возможно ли, что Rails достаточно умен, чтобы распаковать 'Range' при использовании': created_at => ', но не тогда, когда' created_at' является частью необработанного SQL? – echristopherson

+0

Это то, что в первом случае вы позволяете Rails делать свою магию, во-вторых, вы явно говорите, что разместить в запросе;) Пусть Rails делает свою магию для вашего же блага. –

+3

Основной причиной предупреждения является то, что итерация над 'Range' использует' # succ' для достижения следующего элемента каждый раз; и начиная с Ruby 1.9.2 'Time # succ' был отмечен как устаревший, потому что у истинного времени действительно нет дискретного преемника; реализация до 1.9.2 только использовала произвольное соглашение о делении времени на секунды. Это вступает в игру при распаковке «Range» в «Array», что и делает Rails здесь. – echristopherson

Смежные вопросы