Я создаю фильтрацию частичного представления, где пользователь может выбрать 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
.
Есть ли методы получения минимальных и максимальных дат?
вы могли бы просто пропустить этот процесс, если нет 'PARAMS [: от]' или 'PARAMS [: к] 'дано, поэтому любая дата будет соответствовать запросу – MrYoshiji
@MrYoshiji Я добавил код области модели. Мне нужен, чтобы мой SQL-запрос работал, даже если пользователь выбрал только одну дату. – sgnsajgon
Вы можете разделить свою область «start_end» на две разные области: «start_before» и «end_before», если предоставляется только одна из двух дат, и если они предоставлены, используйте область «start_end». Я думаю, что это лучший способ пойти, потому что в этом случае вы не «пытаетесь угадать дату, не предоставленную конечным пользователем», – MrYoshiji