ActiveRecord: проблема с методом 'find' при запросе дат - PullRequest
0 голосов
/ 25 мая 2010

Я борюсь с условиями запроса даты в методе 'find' на моих моделях ActiveRecord, работающих над базой данных SQLite3. Моя модель выглядит следующим образом:

Day:
  failure_day:   date
  failure_count: integer 

Когда я пытаюсь запросить Days, я получаю следующее (только псевдокод):

Query:   Days.all
Result:  [{failure_day: 2010-04-14, failure_count: 1}]

Query:   Days.find(:first, :conditions=>'failure_day > 2010-02-01')
Result:  {failure_day: 2010-04-14, failure_count: 1}

Query:   Days.find(:first, :conditions=>'failure_day = 2010-04-14')
Result:  nil

Query:   Days.find(:first, :conditions=>'failure_day < 2010-05-05')
Result:  nil

Что я не могу понять, так это почему два последних запроса возвращают 'nil'. Первый запрос (Days.all) доказывает, что у меня есть запись в моей базе данных. Второй корректно сопоставляет «fail_day» с датой, которая меньше «fail_day», но при попытке равного или меньшего значения не работает.

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 25 мая 2010

Вы указали только псевдокод, что усложняет задачу.

Вы говорите нам, что ваш столбец fault_date имеет тип DATE. Просто позвольте ActiveRecord обработать детали для вас:

Day.all(:conditions => {:failure_date => Date.today})
Day.all(:conditions => ["failure_date < ?", Date.today])
Day.all(:conditions => {:failure_date => Date.new(1900, 1, 1) .. 5.days.ago})
0 голосов
/ 26 мая 2010

Благодаря проверочным вопросам Франсуа Босолей Мне удалось выяснить, в чем дело. Франсуа напомнил мне, что тесты загружают данные из тестовых приборов (в моем случае test / fixtures / days.yml). Я уже настроил это, но подумал, что лучше дважды проверить формат. В файле days.yml я обнаружил:

one:
  failure_day:   2010/04/14
  failure_count: 1

Заметив, что дата не была определена как 2010-04-14, как в тестах, поэтому я изменил ее на:

one:
  failure_day:   2010-04-14
  failure_count: 1

Все запросы теперь работают!

0 голосов
/ 26 мая 2010

Это ответ на комментарии Франсуа Босолей: «Какую версию ActiveRecord, SQLite, Ruby вы используете? Опишите сессию, где мы увидим код, который вы вводите на консоли, и что находится в development.log»

Я помещаю это здесь, потому что я не могу получить форматирование в комментарии, и это сообщение будет в значительной степени нечитаемым без форматирования!

SQLite version:       3.6.12
ActiveRecord version: 2.3.5

Тестовый код:

require 'test_helper'

class StatTest < ActiveSupport::TestCase
  test "Tmp" do
    # Prints: [#<Day id: 980190962, failure_day: "2010-04-14" ... >]
    p Day.all

    # Prints: []
    p Day.all(:conditions=>["failure_day < ?", '2010-05-14'])

    # Prints: []
    p Day.all(:conditions=>["failure_day < ?", Date.new(2010,5,4)])
  end
end

Test.log

Day Load (0.3ms)   SELECT * FROM "days" 
Day Load (0.1ms)   SELECT * FROM "days" WHERE (failure_day < '2010-05-14') 
Day Load (0.1ms)   SELECT * FROM "days" WHERE (failure_day < '2010-05-04') 

Выполнение любой из этих команд непосредственно из SQLite возвращает ожидаемые строки, поэтому проблема не в команде SQLite, которую генерирует ActiveRecord. Bizarre.

0 голосов
/ 25 мая 2010

вы должны использовать

Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') > '2010-02-01'"])

Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') = '2010-04-14'"])

Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') < '2010-05-05'"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...