Nano Hash - криптовалюты, майнинг, программирование

Как сгенерировать собственный ответ json с помощью Jbuilder и Rails

В моем приложении Ruby on Rails компании по аренде велосипедов могут управлять всеми своими велосипедами (бронирование, оплата и т. д.).

Контекст Я хотел бы предложить компаниям по аренде велосипедов (shops) возможность разместить форму бронирования на своем собственном веб-сайте, чтобы они могли позволить клиентам сделать заказ на bike.

  • В этой форме бронирования будут показаны bike_categories из которых bikes доступны на указанные даты arrival и departure.

Вопрос Чтобы справиться с этим, я хотел бы сгенерировать действие контроллера API, показывающее availability для определенного bike_category, отображающее count для количества доступных bikes, принадлежащих этому bike_category.

Судя по этому сообщению

Разработка API запросов RESTful с длинный список параметров запроса

Я должен иметь возможность обрабатывать запросы в своем API, но как мне вернуть count в представление с помощью Jbuilder?

Код

модели

class Shop < ApplicationRecord
  has_many :bike_categories, dependent: :destroy
  has_many :bikes, through: :bike_categories
  has_many :reservations, dependent: :destroy
end

class Reservation < ApplicationRecord
  belongs_to :shop
  belongs_to :bike
end

class Bike < ApplicationRecord
  belongs_to :bike_category
  has_many :reservations, dependent: :destroy
end

class BikeCategory < ApplicationRecord
  belongs_to :shop
  has_many :bikes, dependent: :destroy
end

маршруты

  namespace :api, defaults: { format: :json } do
    namespace :v1 do
      resources :shops, only: [ :show ]
      resources :reservations, only: [ :show, :create ]
      resources :reservation_contacts, only: [:show, :create]
      resources :reservation_options, only: [:show, :create]
      resources :bike_categories, only: [:index, :show] do
        get :availability, on: :member
      end
    end
  end

контроллеры/API/v1/bike_categories_controller.rb

class Api::V1::BikeCategoriesController < Api::V1::BaseController
  acts_as_token_authentication_handler_for User, only: [:show, :index, :availability]

  def availability
    @user = current_user
    bike_category = params[:bike_category]
    if @user.shop.bike_categories.include? bike_category
      arrival = params[:arrival]
      departure = params[:departure]
      shop = bike_category.shop
      reservations_overlap = shop.reservations.where("reservations.arrival >= ? AND ? >= reservations.arrival", arrival, departure)
      .or(shop.reservations.where("reservations.arrival <= ? AND ? <= reservations.departure", arrival, arrival)).distinct
      unavailable_bikes = []
      reservations_overlap.each do |res|
        if !unavailable_bikes.include? res.bike && res.bike.bike_category == bike_category
          unavailable_bikes << res.bike
        end
      end
      bikes = bike_category.bikes
      @count = (bikes - unavailable_bikes).length
    else
      error
    end
  end

end

просмотры/API/v1/bike_categories.json.jbuilder

# How to return @count?

  • Не было бы проще просто отображать json с помощью адаптера json по умолчанию для клиента? 30.01.2020
  • Спасибо за комментарий Роман. Я не настолько знаком с этим. Как это сработает? Просто включите render json: count: @count в controllers/api/v1/bike_categories_controller.rb? 30.01.2020

Ответы:


1
your code here...
if @user.shop.bike_categories.include? bike_category
      arrival = params[:arrival]
      departure = params[:departure]
      shop = bike_category.shop
      reservations_overlap = shop.reservations.where("reservations.arrival >= ? AND ? >= reservations.arrival", arrival, departure)
      .or(shop.reservations.where("reservations.arrival <= ? AND ? <= reservations.departure", arrival, arrival)).distinct
      unavailable_bikes = []
      reservations_overlap.each do |res|
        if !unavailable_bikes.include? res.bike && res.bike.bike_category == bike_category
          unavailable_bikes << res.bike
        end
      end
      bikes = bike_category.bikes
      @count = (bikes - unavailable_bikes).length
      render json: @count, status: :ok, adapter: :json
    else
      error = ...some code here...
      render json: error, status: unprocessed_entity, adapter: :json
    end

я бы сделал что-то вроде этого

30.01.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..