Rails - 比较Datetime对象(两个表单日期之间的日期)

时间:2014-01-14 03:47:08

标签: ruby ruby-on-rails-3 forms datetime

我一整天都在努力解决问题而无法理解。你如何比较ruby / rails中的两个日期时间变量?

控制器

@events = Event.where('date > ? AND date < ?', params[:timeMin], params[:timeMax])

view:index.html.erb

<%= form_tag events_path, :method => :get do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= datetime_select :timeMin, params[:timeMin] %>
    <%= datetime_select :timeMax, params[:timeMax] %>
    <%= submit_tag "Search Near", :name => nil %>
  </p>
<% end %>

Event模型有一个属性'date',它是一个datetime对象。我已经尝试将params [:timeMin]转换为字符串,但是它们很难比较时间。

总体目标是搜索两次之间发生的事件。

感谢

错误 - 搜索后发生

SQLite3::SQLException: near ",": syntax error: SELECT "events".* FROM "events"  WHERE (date > '---
- (1i)
- ''2014''
','---
- (2i)
- ''1''
','---
- (3i)
- ''8''
','---
- (4i)
- ''14''
','---
- (5i)
- ''36''
' AND date < '---
- (1i)
- ''2014''
','---
- (2i)
- ''1''
','---
- (3i)
- ''13''
','---
- (4i)
- ''14''
','---
- (5i)
- ''36''
') ORDER BY events.created_at DESC

2 个答案:

答案 0 :(得分:2)

你已经使用了datetime_select并且它没有在一个参数[:timeMin]中传递所有内容,你首先必须将它转换为DateTime对象,如下所示

timemin = DateTime.new(params["timeMin(1i)"].to_i,
                       params["timeMin(2i)"].to_i,
                       params["timeMin(3i)"].to_i,
                       params["timeMin(4i)"].to_i,
                       params["timeMin(5i)"].to_i)

以同样的方式将timeMax转换为DateTime对象。然后你可以比较两者。

答案 1 :(得分:0)

您将params直接传递给SQL,因此它无法理解。您需要从参数创建一个DateTime对象。你可以在这里看到其他人如何做到这一点:

Where is the Rails method that converts data from `datetime_select` into a DateTime object?

您可以向下滚动接受的答案,找到一些示例方法。我没有在我面前试用Rails控制台,但我会尝试time_min = DateTime.new(params [:timeMin])。 Rails肯定会将此哈希值转换为将其保存到表示日期的数据库列中的日期。如果你想让Rails做到这一切,你可以将它们作为日期保存到临时表中,只是为了从中获取DateTime对象。然后,您可以在每次新搜索时覆盖它们。