我一整天都在努力解决问题而无法理解。你如何比较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
答案 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对象。然后,您可以在每次新搜索时覆盖它们。