Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 3 活动记录可以';无法正确比较数据库中的日期_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 3 活动记录可以';无法正确比较数据库中的日期

Ruby on rails 3 活动记录可以';无法正确比较数据库中的日期,ruby-on-rails-3,Ruby On Rails 3,我是一个新手,在ruby中使用不同的时间和日期格式。 到目前为止,我已经想出了解决这些问题的办法。在这种情况下,我使用 通过sessiondate和person id()查找或初始化,它总是创建一个新记录,因为(显然)它无法识别从数据库中取出的日期与提供的日期相同。我正在从CSV文件中读取数据,输入如下所示: Fri Apr 22 15:09:00 2011 new record for Mickey Mouse, Fri, 22 Apr 2011 15:09:00 +0000, Fri, 2

我是一个新手,在ruby中使用不同的时间和日期格式。 到目前为止,我已经想出了解决这些问题的办法。在这种情况下,我使用

通过sessiondate和person id()查找或初始化,它总是创建一个新记录,因为(显然)它无法识别从数据库中取出的日期与提供的日期相同。我正在从CSV文件中读取数据,输入如下所示:

Fri Apr 22 15:09:00 2011
new record for Mickey Mouse, Fri, 22 Apr 2011 15:09:00 +0000, Fri, 22 Apr 2011 15:09:00 UTC +00:00
Active record并不抱怨这种格式——它将它放在数据库中的datetime字段中(SQLlite,但我希望该解决方案可以在其他数据库上工作)。我尝试向输入中添加时区,如下所示:

createdate = DateTime.strptime(record_split[ 4 ].chomp + " UTC","%a %b %e %T %Y %Z"
session = Session.find_or_initialize_by_sessiondate_and_person_id(createdate, person.id)
    if session.new_record?
      puts "new record for #{person.name}, #{createdate.inspect}, #{session.sessiondate.inspect}"
输出如下所示:

Fri Apr 22 15:09:00 2011
new record for Mickey Mouse, Fri, 22 Apr 2011 15:09:00 +0000, Fri, 22 Apr 2011 15:09:00 UTC +00:00

在我看来,这当然是相同的日期/时间,为什么ActiveRecord要创建新记录?

可能是因为
个人id
不同

此外,此日期时间也没有什么不同:

Fri, 22 Apr 2011 15:09:00 +0000
vs
Fri, 22 Apr 2011 15:09:00 UTC +00:00

在UTC中存储日期始终是一个好主意,这样您的模型中就可以有如下内容:

def sessiondate=(dt)
  write_attribute(:sessiondate, Time.parse(dt).utc)
end

我对发生的事情有点困惑。从你的例子中,我最关心的是“2010年10月5日星期二19:43:23”被改为“2011年4月22日星期五15:09:00+0000”(除非你对每个例子使用不同的日期…)

为了让自己更轻松,您最好使用
Time.parse
而不是
DateTime.strtime

ree-1.8.7-2010.02 > Time.parse("Tue Oct  5 19:43:23 2010")
 => Tue Oct 05 19:43:23 +1100 2010

要考虑的另一件事是,Rails 3内部将所有时间戳存储为UTC;然后,它会动态显示默认时区中的时间


最后,根据原始时间戳字段的生成方式(即Time.now vs解析字符串),您可能会遇到精度问题。如果
createdate
是使用Time.now填充的,您可能会发现它被保留了一个精确到微秒的值(例如:“19:43:23.34131”),与解析的时间('19:43:23.00000')相比,这个值并不是严格相等的。

您的DateTime.new。。。在我的Rails 3.0.7上不起作用,但我可以向您提供其他方法的建议,这是我在Rails控制台中的测试:

ruby-1.9.2-p136 :028 > v = Video.new :title => "toto"
 => #<Video id: nil> 
ruby-1.9.2-p136 :029 > v.save
 => true 
ruby-1.9.2-p136 :030 > v
 => #<Video id: 507>   
现在在日期字符串上使用String.to_datetime方法

   => #<Video id: 507>  # We get v !!!
 ruby-1.9.2-p136 :043 > v == v3
   => true 
=>##我们得到了v!!!
ruby-1.9.2-p136:043>v==v3
=>正确

p、 s:这是一款I18n应用程序,这就是为什么你看不到title属性。

谢谢你的回复。不,人名是一样的。是的,虽然日期时间映射到同一时间,但打印出来的日期时间略有不同。问题是,如果active record正在向数据库写入一种格式,为什么它会将其读取为稍有不同的格式。但真正的问题是,该怎么办?只是为了好玩,我试着摆脱DateTime.strtime调用,只是传递了一个与active record返回的字符串完全相同的字符串。我得到:“米老鼠的新纪录,id=1”2011年4月22日星期五15:09:00 UTC+00:00“,2011年4月22日星期五15:09:00 UTC+00:00`对不起,这让人困惑。我编辑了一些示例,使其保持一致。我不认为这是一个精确的问题。原始字段只是CSV文件中显示的字符串。它存储在数据库中,然后当再次读取文件时,时间不匹配。它是如何存储在数据库中的?好的,我尝试了time.parse而不是DateTime.strptime(或DateTime.parse,我也尝试过)。它可以工作!所以现在我更困惑了。为什么Ruby中有这么多的Date/Datetime/Time类?什么时候使用哪一个?数据库中的字段是DateTime类型,所以我假设,当在查询中填充字符串导致这个奇怪的结果时,创建一个匹配的DateTime对象可以解决这个问题。我注意到的一个区别是Time.parse在转换中插入本地时区,而DateTime.parse以面值获取字符串并假定它是UTC。尽管如此,这并不能解释这一点。我承认,这有点令人困惑,我仍然不理解它们之间的细微差别。谢天谢地,ActiveSupport似乎在某种程度上使其正常化了;Rails/ActiveSupport似乎将时间用于所有的datetime字段(混乱,否?),这是我在应用程序中使用的。谢谢。是的,这也有效,但我认为这不是绝对必要的,因为根据@Dan,日期在数据库中存储为UTC。我不明白为什么需要使用Time.parse创建一个对象来存储在类型为t.datetime的数据库字段中。另一个修复!我喜欢!但这对我不起作用。但是“录制分割[4]。chomp.to_time”确实有效。试想一下,假设rails 3.0.6和3.0.7之间存在差异?或者您使用的是什么数据库?MySQL在开发中,与SQLlite几乎没有区别。我用String.to_time在MySQL上为你做了尝试,这也很有效必须是以DB为单位的差值。刚刚更新到3.0.7,行为没有变化。感谢您的检查。to_time--很高兴知道在迁移到mysql时它会起作用。是的,我确信这是因为to_datetime和SQLlite(不是版本问题),我建议您在开发中使用mysql