Проверка существующей строки с использованием столбца DateTime завершается неудачно - PullRequest
2 голосов
/ 03 октября 2011

Я пытаюсь найти строку, используя значение DateTime. Если строка существует, верните ее; в противном случае создайте новую строку.

Проблема, которую я вижу, заключается в том, что при поиске sql используется другое значение даты и времени для вставки. Поскольку в моем столбце даты и времени есть уникальный индекс, при втором вызове я получаю ошибку db, не допускающую дублирования.

Кажется, это связано с летним временем, которое экономит разницу в 1 час, но я в тупике. Я установил для своего часового пояса «Лондон» в environment.rb, а база данных mysql хранит все даты как utc.

Запуск метода doit дважды с одним и тем же параметром приводит к 2 строкам в базе данных - он должен создавать только одну.

Я собрал тестовый класс, чтобы продемонстрировать, что я пытаюсь сделать. А также журнал разработки, чтобы вы могли видеть генерируемый sql.

Я уверен, что пропустил какой-то базовый факт, касающийся преобразования datetime в utc до / при попадании в базу данных, но я исследовал и не могу определить, что сделал неправильно.

Рельсы: 2.3.10 mysql: 5.1.49

Спасибо

class TestDate < ActiveRecord::Base

  # create table test_dates (thedate datetime not null);

  def self.doit(for_date)
    r = find_by_thedate(for_date)
    if r.nil?
      r = TestDate.new(:thedate => for_date)
      r.save!
    end
    r
  end

end

>> TestDate.doit(DateTime.now.midnight)
=> #<TestDate thedate: "2011-10-02 23:00:00">

  TestDate Load (0.3ms)   SELECT * FROM `test_dates` WHERE (`test_dates`.`thedate` = '2011-10-03 00:00:00') LIMIT 1
  SQL (0.1ms)   BEGIN
  TestDate Create (0.2ms)   INSERT INTO `test_dates` (`thedate`) VALUES('2011-10-02 23:00:00')
  SQL (0.1ms)   COMMIT

1 Ответ

0 голосов
/ 03 октября 2011

Вы можете попробовать следующее:

r.save(:validate => false)

Поскольку r.save! запустит ваши проверки, я думаю, что это откатит ваш запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...