2014-01-14 299 views
0

我一直在努力解决一个问题,并且无法弄清楚。你如何比较ruby/rails中的两个日期时间变量?Rails - 比较日期时间对象(两个表单日期之间的日期)

控制器

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

视图: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 %> 

事件模型具有属性 '日期',这是一个日期时间对象。我试过将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 
+0

它看起来很好,我可以发布一些实际的错误/问题你有查询吗? – Nikolay

回答

2

您已经使用datetime_select并没有通过在一个PARAMS一切[:时间min],你首先必须将它转换成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对象。然后你可以比较两者。

0

您直接传递到PARAMS SQL后会发生,所以它不理解。你需要从params中创建一个DateTime对象。你可以看到其他人如何在这里做到了:

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

您可以向下滚动过去接受的答案找到了一些示例方法。我没有Rails控制台在我面前尝试,但我会尝试time_min = DateTime.new(params [:timeMin])。当你将它保存到代表日期的DB列中时,Rails肯定会将此散列转换为日期。如果你想让Rails完成所有的工作,你可以将两个日期保存为一个临时表,以便将DateTime对象从中取出。然后您可以用每次新的搜索覆盖它们。