Ruby on rails 使用DateTime列检查现有行失败
我正在尝试使用DateTime值查找一行。如果该行存在,则返回该行;否则,创建新行 我看到的问题是findsql对insert使用了不同的datetime值。因为在我的datetime列上有一个唯一的索引,我在第二次调用时得到了一个重复的不允许的db错误 这似乎与夏季节省1小时的时间差有关,但后来我被难倒了。我在environment.rb中将时区设置为“London”,mysql数据库将所有日期存储为utc 使用相同的参数运行'doit'方法两次会在数据库中产生两行-它应该只创建一行 我已经组织了一个测试类来演示我要做的事情。以及开发日志,以便您可以看到正在生成的sql 我肯定我错过了一些关于在访问数据库之前/时将datetime转换为utc的基本事实,但我已经研究过了,我无法确定我做错了什么 轨道:2.3.10 mysql:5.1.49 谢谢Ruby on rails 使用DateTime列检查现有行失败,ruby-on-rails,Ruby On Rails,我正在尝试使用DateTime值查找一行。如果该行存在,则返回该行;否则,创建新行 我看到的问题是findsql对insert使用了不同的datetime值。因为在我的datetime列上有一个唯一的索引,我在第二次调用时得到了一个重复的不允许的db错误 这似乎与夏季节省1小时的时间差有关,但后来我被难倒了。我在environment.rb中将时区设置为“London”,mysql数据库将所有日期存储为utc 使用相同的参数运行'doit'方法两次会在数据库中产生两行-它应该只创建一行 我已经组
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
您可以尝试以下方法:
r.save(:validate => false)
因为r.拯救!将运行您的验证,我认为它会回滚您的查询。您可以尝试以下操作:
r.save(:validate => false)
因为r.拯救!将运行您的验证,我认为它会回滚您的查询。看起来这是其他人发现的,并且被发现了很多:看起来这是其他人发现的,并且被发现了很多: