2015-06-23 3 views
1

Я создаю фильтрацию частичного представления, где пользователь может выбрать from -date и to -date, используя календарь. Эти даты используются тогда в пределах модели для выполнения предложения SQL Where в запросе базы данных. Если пользователь не выбирает одну из дат, должно быть назначено значение по умолчанию: минимальная доступная дата для from и максимальная для to.Самая маленькая и самая большая возможная дата

unless params[:from].blank? and params[:to].blank? 
    from = begin Date.parse(params[:from]) rescue ??? end 
    to = begin Date.parse(params[:to]) rescue ??? end 
    @model_instances = @model_instances.start_end from, to 
end 

(...)

scope :start_end, -> (start_date, end_date) { where('(:start_date <= "from" AND "from" <= :end_date) OR' + 
               '(:start_date <= "to" AND "to" <= :end_date) OR' + 
               '("from" <= :start_date AND :end_date <= "to")', 
               {start_date: start_date, end_date: end_date}) } 

В модель Дата атрибуты from и to также поля базы данных в соответствующей таблице.

В Rails Date класс имеет семейство методов beginning_of (день, неделю, месяц и т.д.), но не существует никаких методов таких beginning_of_time, end_of_time, Date.min, Date.max.

Есть ли методы получения минимальных и максимальных дат?

+0

вы могли бы просто пропустить этот процесс, если нет 'PARAMS [: от]' или 'PARAMS [: к] 'дано, поэтому любая дата будет соответствовать запросу – MrYoshiji

+0

@MrYoshiji Я добавил код области модели. Мне нужен, чтобы мой SQL-запрос работал, даже если пользователь выбрал только одну дату. – sgnsajgon

+1

Вы можете разделить свою область «start_end» на две разные области: «start_before» и «end_before», если предоставляется только одна из двух дат, и если они предоставлены, используйте область «start_end». Я думаю, что это лучший способ пойти, потому что в этом случае вы не «пытаетесь угадать дату, не предоставленную конечным пользователем», – MrYoshiji

ответ

2

Вы можете пропустить условие на start и end даты, если нет Титулы не дано:

if params[:from].present? and params[:to].present? 
    @model_instances.start_end(params[:from], params[:to]) 
end 

И тогда вы получите результаты, не зависящие от даты, так как не from и/или end даты были заполнены.

0

Вы можете сравнить диапазоны дат с значениями вашей модели и установить значения по умолчанию, если параметры не пройдены.

#setup default if desired, or you can skip if params are blank 
from = params[:from] || default_from 
to = params[:to] || default_to 
@model_instances.start_end(from, to) 

и ваша сфера будет выглядеть примерно так, если вы использовали диапазоны дат для ActiveRecord

scope :start_end, ->(start_date, end_date){where(from: start_date..end_date, to:start_date..end_date)} 
Смежные вопросы