【问题标题】:Rails - Comparing Datetime objects (date between two form dates)Rails - 比较 Datetime 对象(两个表单日期之间的日期)
【发布时间】:2014-02-02 01:15:28
【问题描述】:

我整天都在为一个问题苦苦挣扎,却无法弄清楚。如何比较 ruby​​/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

【问题讨论】:

  • 对我来说看起来不错,您能否发布一些您在查询中遇到的实际错误/问题?

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


【解决方案1】:

你已经使用了 datetime_select 并且它不会在一个 params[: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 对象。然后你可以比较两者。

【讨论】:

    【解决方案2】:

    您将参数直接传递给 SQL,所以它不明白。您需要从参数创建一个 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 对象。然后,您可以在每次新搜索时覆盖它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      相关资源
      最近更新 更多