Поскольку вы создаете модели для хранения shops
, bikes
и т. Д., Вы должны уточнить основные атрибуты создаваемых вами моделей:
Shop
должен иметь атрибут id
или name
или key
, чтобы отличить guish друг от друга;
Reservation
должно иметь rental_started_at
и rental_ended_at
, таким образом, вы можете судить, занят ли велосипед в период прибытия и отправления пользователь.
Предположим, что запрос от клиента магазина отправляет вам такие данные:
{
"shop_id": "xxx",
"arriving_at": "2020-02-10",
"departing_at": "2020-02-15",
"bike_category": "xxx" # optional
}
Помните, что параметр shop_id
(как бы он ни назывался на стороне клиента) важен, иначе вы не в состоянии определить, какой магазин отправляет вам запрос. Все, что вам нужно сделать, это получить параметры из запроса выше и выполнить поиск в базе данных, а затем вернуть данные клиенту. Я предполагаю, что вы возвращаете категории и холостые велосипеды вместе клиенту, поэтому структура данных, которую я разработал, выглядит следующим образом:
response_data = {
"status": 201,
"data": {
"shop_id": 1,
"shop_name": "xxx"
"categories": [
{
"category_id": 1,
"category_name": "xxx",
"bikes": [
{
"bike_id": "1",
"bike_name": "xxx"
}
]
}
]
}
}
Ниже приведен пример кода в соответствии с моими идеями:
class OnlineBookingsController < ApplicationController
skip_before_action :authenticate_user!, :raise => false
skip_after_action :verify_authorized
def availability_overview
# get bike categories, which type is an array
categories = params[:bike_category].nil? shop.bike_categories : specified_bike_categories
# TODO: here you can add shop information to response data
# get all idle bikes and its belonging category
categories.map do |category|
# TODO: here you append category to categories of response data
category.bikes.map do |bike|
# get last reservation of a bike
last_reservation = bike.reservations.order_by(:created_at, -1).first
# if the bike is idle
if last_reservation.rental_ended_at < params[:arriving_at].to_time
# TODO: here you append idle bike to bikes of categories
end
end
end
return response_data
end
private
# get shop by param shop_key
def shop
@shop ||= Shop.find_by(id: params[:shop_id])
end
# get bike category object by param bike_category if not nil
def specified_bike_categories
@specified_bike_categories ||= shop.bike_categories.where(category: params[:bike_category])
end
end
В вашем routes.rb
вы должны написать, как показано ниже, так как ваш контролер называется OnlineBookingsController
, и вы создаете метод GET availability_overview
:
namespace :api, defaults: { format: :json } do
namespace :v1 do
resources :online_bookings do
member do
get 'availability_overview'
end
end
end
end
Надеюсь, что это может помочь вам:)