在我的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 >= Time.now
而发生。如果我将其更改为s.show_time = Time.now
错误,但它只显示当前时间而不是数据库中的时间。
值得注意的是,show_date和show_time在同一记录中,例如第一条记录的日期可能是26/01/2015,时间是22:00。我想要的是显示日期在未来的记录时间并显示该日期的第一次,因为数据库中有两条记录,日期为26/01/2015,另一条记录有时间22:00和另一个时间22:30。
有人可以帮忙吗?
答案 0 :(得分:1)
在您的示例中,您将整个数据库加载到内存中,然后对其进行过滤以找到具有所需时间的行。我让数据库完成所有工作。
film.showings.where("show_time >= ?", Time.now).order(show_time: :asc).first
即使您认为应该存在,也没有适当的时间来回答您的实际原始问题。你可能会或可能不会遇到这种方法的问题 - 如果你这样做,调试它将不同于调试你的&#34;所有内存中的红宝石&#34;原始方法,所以我从这开始,然后通过查看生成的SQL等进行调试。
另一方面,如果你只想要十几个结果来过滤,也许你的方法也很好。
此外,如果数据库中的每一行都有一个日期和一次 - 我会更改您的数据库架构,以便在一列中使用组合日期+时间值。通常这是最好的方式。对于电影数据库,我可以看到分隔日期和时间可能有意义 - 但如果每一行都有一个日期和一个时间,那么将它们组合为日期时间并没有不利之处,那就是我做了什么。我怀疑如果你这样做你的错误可能会消失 - 你应该能够用不同的日期和时间来做,当然,但是组合起来更有意义,并且不会混淆处理红宝石也。
答案 1 :(得分:0)
这是非常奇怪的代码 但我认为它没有找到合适的记录 试试这个:
<% 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 %>
如果它没有崩溃,我是对的。