Как написать область для rails (используя has_scope), которая находит заказы с датой created_at между двумя заданными датами (start_date и end_date)

#ruby-on-rails #ruby #ruby-on-rails-5

#ruby-on-rails #ruby #ruby-on-rails-5

Вопрос:

У меня есть текущая область, которая не работает.

Но объясняет, чего я пытаюсь достичь.

   scope :range, -> (start_date, end_date) { where("orders.created_at BETWEEN (?) AND (?)", start_date.to_date, end_date.to_date)}
 

Я ищу способ получить все заказы между двумя заданными датами.

Я правильно указываю параметры.

 http://localhost:3000/api/v1/reports/organisations/1/sales-reports?range[start_date]=2020-12-27amp;range[end_date]=2020-12-28
 

Буду признателен за любую помощь в области, которая подходит для моего варианта использования.

Комментарии:

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

Ответ №1:

О чем я думаю, так это о критериях, которые вы используете orders.created_at вместо того, чтобы просто created_at использовать.

Кроме того, это делает ActiveRecord ответственным за написание SQL вместо себя.

 scope :range, ->(start_date, end_date) { where(created_at: start_date.to_date..end_date.to_date) }
 

Кроме того, я бы попытался передать start_date и end_date как даты, потому что вы говорите, что это даты, а не строковые представления дат.

Комментарии:

1. Спасибо, это намного более лаконично и читаемо

Ответ №2:

Оказывается, что, поскольку я использую драгоценный камень has_scope.

все, что мне было нужно, это использовать опцию «using».

 has_scope :range, using: %i[start_date end_date], type: :hash