Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用DateTime列检查现有行失败_Ruby On Rails - Fatal编程技术网

Ruby on rails 使用DateTime列检查现有行失败

Ruby on rails 使用DateTime列检查现有行失败,ruby-on-rails,Ruby On Rails,我正在尝试使用DateTime值查找一行。如果该行存在,则返回该行;否则,创建新行 我看到的问题是findsql对insert使用了不同的datetime值。因为在我的datetime列上有一个唯一的索引,我在第二次调用时得到了一个重复的不允许的db错误 这似乎与夏季节省1小时的时间差有关,但后来我被难倒了。我在environment.rb中将时区设置为“London”,mysql数据库将所有日期存储为utc 使用相同的参数运行'doit'方法两次会在数据库中产生两行-它应该只创建一行 我已经组

我正在尝试使用DateTime值查找一行。如果该行存在,则返回该行;否则,创建新行

我看到的问题是findsql对insert使用了不同的datetime值。因为在我的datetime列上有一个唯一的索引,我在第二次调用时得到了一个重复的不允许的db错误

这似乎与夏季节省1小时的时间差有关,但后来我被难倒了。我在environment.rb中将时区设置为“London”,mysql数据库将所有日期存储为utc

使用相同的参数运行'doit'方法两次会在数据库中产生两行-它应该只创建一行

我已经组织了一个测试类来演示我要做的事情。以及开发日志,以便您可以看到正在生成的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

您可以尝试以下方法:

r.save(:validate => false)

因为r.拯救!将运行您的验证,我认为它会回滚您的查询。

您可以尝试以下操作:

r.save(:validate => false)

因为r.拯救!将运行您的验证,我认为它会回滚您的查询。

看起来这是其他人发现的,并且被发现了很多:看起来这是其他人发现的,并且被发现了很多: