【问题标题】:Display the closest future time to now from database显示从数据库到现在最近的未来时间
【发布时间】:2015-03-25 07:38:47
【问题描述】:

在我的 Ruby on Rails 应用程序中,我希望能够在数据库中显示最接近当前时间的下一个未来时间,例如,如果数据库中存在时间为 13:00、13 的记录: 30、18:00、19:00 等。如果当前时间为 13:48,则将显示时间 18:00。我有类似的事情处理日期:

<% film.showings.take(1).each do |showing| %>
    <%= film.showings.select{|s| s.show_date >= Date.today}.sort_by(&:show_date).first.show_date.strftime("%A %e %B %Y") %>
<% end %>

但试图随着时间的推移来适应这一点:

<% film.showings.take(1).each do |showing| %>
    <%= film.showings.select{|s| s.show_time >= Time.now}.sort_by(&:show_time).first.show_time %>
<% end %>

这不起作用,我收到以下错误:

undefined method `show_time' for nil:NilClas

由于s.show_time &gt;= Time.now 而发生。如果我将其更改为s.show_time = Time.now,则会出现错误,但它只显示当前时间,而不是数据库中的时间。

值得注意的是,show_date 和 show_time 在同一条记录中,例如第一条记录的日期可能是 26/01/2015,时间是 22:00。我想要的是显示日期在未来的记录时间并显示该日期的第一次,因为数据库中可能有两条记录,日期为 26/01/2015,一条记录的时间为 22:00另一个时间是 22:30。

谁能帮忙?

【问题讨论】:

  • 有必要解释一下您是如何存储时间的。 Time.now 返回一个 Time 对象,但这也包括日期信息。如果您只在数据库中存储小时和分钟,那么您很可能会将 1970 年或 2000 年的时间与当前时间进行比较,在这种情况下,显然不会是未来。
  • 另外s.show_time = Time.now 将时间设置为当前时间,而不是测试它是否当前时间,因为您使用的是= 而不是==。它还解释了为什么您没有从数据库中获取时间,因为您刚刚将其设置为 Time.now

标签: ruby-on-rails ruby date time


【解决方案1】:

这是很奇怪的代码。
但我认为它没有找到合适的记录。
试试这个:

<% film.showings.take(1).each do |showing| %>
  <%= film.showings.select{|s| s.show_time >= Time.now}.sort_by(&:show_time).first.try(:show_time) %>
<% end %>

如果它没有崩溃,我是对的。

【讨论】:

  • 它没有崩溃,但它没有显示任何东西?
  • 所以你没有s.show_time &gt;= Time.now的记录
  • 我在数据库中有记录,时间是22:00,所以它应该可以工作
  • 他们的日期是什么时候?它不仅测试时间,还测试日期
  • 有什么想法吗?
【解决方案2】:

在您的示例中,您将整个数据库加载到内存中,然后对其进行过滤以找到所需时间的行。我会让数据库完成所有工作。

film.showings.where("show_time >= ?", Time.now).order(show_time: :asc).first

这并不能回答您实际的原始问题,即使您认为应该有,但似乎没有合适的时间。您可能会也可能不会遇到这种方法的问题——如果您这样做了,调试它将不同于调试“使用 ruby​​ 全部在内存中”的原始方法,所以我将从这个开始,然后通过查看进行调试生成的 SQL 等。

另一方面,如果您只希望过滤十几个结果,也许您的方法也可以。

此外,如果您的数据库中的每一行都有一个日期和一个时间——我会更改您的数据库架构以在一列中使用组合的日期+时间值。通常这是最好的方法。对于电影数据库,我可以看到将日期和时间分开可能是有道理的——但如果每一行都已经有一个日期和一个时间,那么将它们组合为一个日期时间没有任何缺点,这就是我要做的。我怀疑如果你这样做,你的错误可能会消失——你应该可以用单独的日期和时间来做,当然,但结合起来更有意义,并且处理起来更容易混淆红宝石也是。

【讨论】:

  • 您建议将该代码放在哪里?我目前在我的控制器中没有为此的方法,所以我应该为该代码创建一个方法吗?我在数据库中也没有很多次,并且希望将日期和时间分开,以便用户最终可以添加一个而不添加另一个。感谢您的回复!
  • 我不知道把它放在哪里,放在哪里,放在哪里,哪里有你的代码?将日期和时间分开可能是合理的。如果您不想让数据库为您完成工作,那么您可以返回调试您的代码。你只需要调试它;虽然这是奇怪的代码;您可能想仔细阅读每一部分并确保您理解它,您是否只是从某个地方复制并粘贴它?
猜你喜欢
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 2020-09-03
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多