Условия даты с использованием логики поиска - PullRequest
1 голос
/ 02 декабря 2009

Плагин 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}

При использовании двух форматов форма не будет отображаться в раскрывающемся списке. Похоже, что формат в поисковом объекте также использует время, отрегулированное по часовому поясу.

Есть мысли о том, как справиться с этим?

Ответы [ 2 ]

1 голос
/ 04 декабря 2009

Кажется, что большая часть вашей проблемы происходит, потому что вы конвертируете строки в даты и возвращаетесь к строкам. Я полагаю, что вы делаете это больше, чем нужно.

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 => true вместо [['','']] (на мой взгляд, более читабельно для человека), и я использовал закрытый тег <br/> (стандартный материал HTML - может быть, вы сделали опечатку?). 1010 *

Кстати, если вы хотите указать Date, вы можете использовать конструктор Date. Это короче, чтобы написать и быстрее выполнить, чем создание строки и парсинг даты из нее.

#Date(2009,11,1) is faster, shorter, and equivalent
Date(2009,11,1) == '2009-11-01'.to_date # --> true
0 голосов
/ 02 декабря 2009

Вы ищете записи за данный месяц? Проверьте мой by_star драгоценный камень / плагин для этого.

...