find_by_foo не может вернуть некоторые записи (но не другие) в Rails 3 - PullRequest
0 голосов
/ 22 июня 2011

В моем приложении на Rails есть модель Cycle с атрибутом start, который является датой. Я сталкиваюсь с очень странной проблемой, когда иногда Cycle.find_by_start возвращает ожидаемую запись, а в других случаях возвращается nil.

Например, Cycle.find_by_start("2011-05-01") возвращает следующее:

=> #<Cycle id: 45, created_at: "2011-05-15 22:38:35", 
updated_at: "2011-05-15 22:38:35", user_id: 20,
start: "2011-05-01", ending: nil, startguess: false, endingguess: nil>

Но выполнение Cycle.find_by_start("2011-05-13") возвращает nil, хотя существует запись с совпадающим значением start. Я проверил, что запись существует, и начальное значение совпадает, выполнив следующую команду в консоли Rails.

irb(main):012:0> Cycle.find(47)
=> #<Cycle id: 47, created_at: "2011-05-23 01:28:59",
updated_at: "2011-06-21 00:38:34", user_id: 12,
start: "2011-05-13", ending: "2011-05-31", startguess: false, endingguess: false>

irb(main):011:0> Cycle.find(47).start == "2011-05-13".to_date
=> true

Возможно, актуальная информация: Запуск Rails 3.0.7 в режиме разработки с базой данных SQLite.

Есть идеи или советы по устранению неполадок?

Редактировать 1

Журнал используемых запросов SQL:

[94m19:10:11 active_record [37mCycle Load (1.0ms)  SELECT "cycles".* FROM "cycles" WHERE "cycles"."start" = '2011-05-01' LIMIT 1
[94m19:10:19 active_record [37mCycle Load (0.0ms)  SELECT "cycles".* FROM "cycles" WHERE "cycles"."start" = '2011-05-13' LIMIT 1

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Если: start - поле даты, то лучше передать find_by_start фактический объект Date, а не строку. Итак:

Cycle.find_by_start(Date.parse("2011-05-13"))

(я использую Date.parse для создания здесь объекта date, но вы также можете использовать Date.new или Date.today или другой метод)

Передача строки в метод поиска может работать, но, как вы обнаружили, может и не работать - в зависимости от типа базы данных и того, как база данных интерпретирует строку.

0 голосов
/ 22 июня 2011

Даты .... у вас может быть проблема с синтаксическим анализом, поскольку форматы США / Великобритании меняются местами и приводят к путанице. Я часто нахожу, что это помогает сделать дату однозначной (при условии, английские месяцы):

Cycle.find_by_start("13 May 2011")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...