2012-02-16 6 views
1

Попытка создать фильтр выбора, чтобы найти графики с coursedates в пределах заданного диапазона дат:Rails - Фильтрация по диапазону дат

AdminController:

def find_schedules 
    if params[:start_date] && params[:end_date] 
    start_date = params[:start_date] 
    end_date = params[:end_date] 
    @schedules = Schedule.find(:all, :conditions => {:coursedate => start_date..end_date}) 
    redirect_to :action => 'find_results' 
    end 
end 

find_schedules Вид:

<% form_tag(find_schedules_path) do %> 
<%= select_date Date.today, :prefix => :start_date %> 
<%= select_date Date.today, :prefix => :end_date %>> 
<%= submit_tag "Submit", :disable_with => "Submitting..." %> 
<% end %> 

Ошибка :

Processing AdminController#find_schedules (for ...) [POST] 
    Parameters: {"start_date"=>{"month"=>"3", "day"=>"23", "year"=>"2011"}, "commit"=>"Submit", "authenticity_token"=>"...", "end_date"=>{"month"=>"2", "day"=>"16", "year"=>"2012"}} 

ArgumentError (bad value for range) 

Кажется, у меня всегда были проблемы с датами/датами. coursedate - это поле datetime в таблице расписаний, если это имеет значение. Мне нужно только искать даты, а не раз. Мне нужно каким-то образом преобразовать тип данных из-за того, как он хранит mysql? Или ... что еще я делаю неправильно? Заранее спасибо за вашу помощь.

Подойдя ближе после помощи bdon, спасибо! Теперь я получаю неопределенную ошибку метод, но я должен быть в состоянии понять, что из:

ActionView::TemplateError (undefined method `each' for nil:NilClass) on line #26 of /admin/find_results.html.erb:  
25: <tr class="<%= cycle('odd', 'even') %>"> 
26: <% @schedules.each do |schedule| %> 

ответ

1

Вы получаете эту ошибку, потому что функция «диапазон» не поддерживает хэши, которые в настоящее время передаются в этот случай:

1.9.3-p0 :008 > {:year => 2012, :month => 11, :day => 1}..{:year => 2012, :month => 12, :day => 1} 
ArgumentError: bad value for range 

Вместо этого вам нужно сделать начало и конец диапазона быть DateTime объекты:

1.9.3-p0 :010 > DateTime.new(2012,11,1)..DateTime.new(2012,12,1) 
=> Thu, 01 Nov 2012 00:00:00 +0000..Sat, 01 Dec 2012 00:00:00 +0000 

Так

start_params = params[:start_date] 
start_date = DateTime.new(start_params["year"].to_i, start_params["month"].to_i, start_params["day"].to_i) 

Сделайте то же самое для end_date.

+0

Большое спасибо за ваш ответ. Иногда мне плохо. Я попытался исправить, но получил: ArgumentError (сравнение String с 0 не удалось) Я также попытался: start_date = params [: start_date] .values_at (: month,: day,: year) ... любые мысли? Еще раз спасибо. :) –

+0

Редактирование исходного ответа: вам нужно повернуть каждый из параметров из строк в целые числа с помощью to_i. – bdon

+0

Подходите ближе, спасибо ... теперь получите еще одну ошибку, но я смогу работать через нее. :) –

Смежные вопросы