显示从数据库到现在最近的未来时间
在我的Ruby on Rails应用程序中,我希望能够在数据库中显示最接近当前时间的下一个未来时间,例如,如果存在时间为13:00,13:30,18的记录,则在数据库中显示:00,19:00等。如果当前时间是13:48,则显示时间18:00。 我有一个类似的事情与日期:
= Date.today}.sort_by(&:show_date).first.show_date.strftime("%A %e %B %Y") %>
但试图适应这个时间:
= Time.now}.sort_by(&:show_time).first.show_time %>
这不起作用,我收到以下错误:
undefined method `show_time' for nil:NilClas
这是因为s.show_time >= Time.now
。 如果我将其更改为s.show_time = Time.now
错误发生但是它只显示当前时间而不是数据库中的时间。
值得注意的是,show_date和show_time在同一记录中,例如第一条记录的日期可能是26/01/2015,时间是22:00。 我想要的是显示日期在未来的记录时间并显示该日期的第一次,因为数据库中有两条记录,日期为26/01/2015,另一条记录的时间为22:00另一个时间是22:30。
有人可以帮忙吗?
在您的示例中,将整个数据库加载到内存中,然后对其进行过滤以找到具有所需时间的行。 我让数据库完成所有工作。
film.showings.where("show_time >= ?", Time.now).order(show_time: :asc).first
即使您认为应该存在,也没有回答您的实际原始问题。 你可能会或可能不会遇到这种方法的问题 – 如果你这样做,调试它将不同于调试你的“所有内存与ruby”的原始方法,所以我从这开始,然后通过查看调试SQL生成等
另一方面,如果你只想要十几个结果来过滤,也许你的方法也很好。
此外,如果数据库中的每一行都有一个日期和一次 – 我会更改您的数据库架构,以在一列中使用组合日期+时间值。 通常这是最好的方式。 对于电影数据库,我可以看到分隔日期和时间可能有意义 – 但如果每一行都有一个日期和一个时间,那么将它们组合为日期时间并没有缺点,这就是我要做的事情。 我怀疑如果你这样做你的错误可能会消失 – 你应该能够分开日期和时间来做,当然,但结合起来更有意义,并且在ruby中处理也不会那么混乱。
这是非常奇怪的代码。
但我认为它找不到合适的记录。
试试这个:
<% 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 %>
如果没有崩溃,我是对的。