【问题标题】:Date conditions using Search logic使用搜索逻辑的日期条件
【发布时间】:2009-12-01 22:46:36
【问题描述】:

Rails 插件 - Searchlogic,来自二进制逻辑 - 提供按日期过滤的功能。我的表单是这样设置的......

<% form_for @search do |f| %>
    <%= f.label :start %> <%= f.select :due_at_after, [[['','']],['November', '2009-11-01'.to_date],['December', '2009-12-01'.to_date]]  %><br>
    <%= f.label :end %> <%= f.select :due_at_before, [[['','']],['December', '2009-12-01'.to_date],['January', '2010-01-01'.to_date]]  %>
    <%= f.submit 'Search' %>
<% end %>

但是,我从控制器中生成的@search 对象返回的日期...

@search = Task.with_member(current_user).search(params[:search])

正在生成一个看起来像这样的日期参数

{:due_at_after=>Sat, 31 Oct 2009 20:00:00 EDT -04:00}

使用这两种格式,表单将不会将下拉菜单显示为选中状态。看起来 searchlogic 对象中的格式也使用了时区调整时间。

关于如何处理这个问题有什么想法吗?

【问题讨论】:

  • 我发现 calendar_date_select gem 有效,但仍然存在一些问题。日期格式发生了变化,但在文本字段中,这比选择框的问题要小。仍在寻找正确的方法来做到这一点。

标签: mysql ruby-on-rails datetime timezone searchlogic


【解决方案1】:

您的问题的很大一部分似乎正在发生,因为您将字符串转换为日期,并将日期转换为字符串。我相信你可能做的比你需要的更多。

HTML 表单并不真正“理解”日期——它们只是“理解”字符串。所以可以传递字符串而不是日期。也就是说,把to_date去掉就可以了。

<% form_for @search do |f| %>
    <%= f.label :start %>
    <%= f.select :due_at_after,
          ['November', '2009-11-01'],['December', '2009-12-01']],
          :include_blank => true
    %>
    <br/>
    <%= f.label :end %>
    <%= f.select :due_at_before,
          [['December', '2009-12-01'],['January', '2010-01-01']],
          :include_blank => true
    %>
    <%= f.submit 'Search' %>
<% end %>

另外,我更喜欢使用:include_blank =&gt; true 而不是[['','']](我认为更易于阅读),并且我使用了封闭的&lt;br/&gt; 标记(标准的html 内容——也许你打错了?)。

顺便说一句,如果你想指定一个日期,你可以使用一个日期构造函数。它比创建字符串并从中解析日期更短,执行速度更快。

#Date(2009,11,1) is faster, shorter, and equivalent
Date(2009,11,1) == '2009-11-01'.to_date # --> true

【讨论】:

    【解决方案2】:

    您是否要查找给定月份的记录?请查看我的by_star gem/plugin。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多