Rails将时间列与现在进行比较

时间:2014-11-17 18:03:44

标签: ruby-on-rails time

快速提问。

我在视图中有以下内容

<tbody>

    <% @courses.each do |course| %>
      <% if course.lec_exam.eql?("LEC")%>
      <tr class ="text-center">
        <td><%= course.location %></td>

        <% if (Time.now > course.begin_time && Time.now < course.end_time)
          course.status = 'Taken'
        else
          course.status ='Open'
          end %>
        <td><%= course.status %></td>
        <td><%= course.begin_time %></td>
        <td><%= course.end_time %></td>
        <td><%= link_to 'Edit Status', edit_course_path(course) %></td>
      </tr>
      <% end %>
    <% end %>
  </tbody>

我测试了这个,begin_time总是等于true,end_time总是等于false。作为参考,我的DB通过以下方式存储列。如果它有所不同,则通过CSV导入值。

t.time     "begin_time"
t.time     "end_time"

一些示例begin_time和end_time值:

2000-01-01 10:30:00 UTC     2000-01-01 11:20:00 UTC

2000-01-01 11:30:00 UTC     2000-01-01 12:20:00 UTC

所以我可以看到为什么begin_time等于true以及为什么end_time等于false。为什么这些值只有在CSV和DB中存储时才与它们相关联?在CSV中,它们存储为上午10:30,上午11:20等。

任何指针?有什么明显我错过了吗?

2 个答案:

答案 0 :(得分:1)

首先,您应该将逻辑移到模型中。 其次,Rails:time数据类型仍然将日期存储到数据库中(即使它没有被使用)。我们必须手动删除日期:

Class Course < ActiveRecord::Base

  def status
    t = Time.now.utc.strftime("%H%M%S%N")
    end_time_f = self.end_time.utc.strftime("%H%M%S%N")
    begin_time_f = self.begin_time.utc.strftime("%H%M%S%N")

    ’if (t >= begin_time_f && (t <= end_time_f)
      status = 'Taken'
    else
      status = 'Open'
    end
    return status
  end
end

然后在您的视图中,您只需拨打course.status

即可

答案 1 :(得分:0)

解决。利用上面的答案,以及'tod'gem,它为Time和DateTime提供to_time_of_day方法。

def status
 t = Time.now.to_time_of_day
 bt = self.begin_time.to_time_of_day
 et = self.end_time.to_time_of_day
 if (t >= bt) && (t<=et)
   status = 'Taken'
 else
   status = 'Open'
 end
 return status
end