Я пытаюсь найти строку, используя значение 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