2014-01-14 3 views
0

Я борюсь с проблемой весь день и не могу понять это. Как вы сравниваете две переменные datetime в ruby ​​/ rails?Rails - Сравнение объектов Datetime (дата между двумя датами формы)

Контроллер

@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 %> 

Модель событий имеет атрибут 'дата', которая является объектом 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

это выглядит хорошо для меня, не могли бы вы опубликовать некоторые из фактических ошибок/проблем, которые у вас были с запросами? – Nikolay

ответ

2

Вы использовали 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. Тогда вы можете сравнить оба.

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, безусловно, преобразует этот хэш в дату, когда вы сохраняете его в столбце DB, который представляет дату. Если вы хотите, чтобы Rails делал все это, вы могли бы сохранить как даты, так и временную таблицу, чтобы получить из нее объекты DateTime. Затем вы можете перезаписать их с каждым новым поиском.

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