Rails, как сохранить данные при создании с помощью внешнего API? - PullRequest
0 голосов
/ 30 марта 2020

В моем приложении для bike_rental_shops я даю возможность этим магазинам управлять прокатом велосипедов.

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

Вопрос Как сохранить только новые прокаты, а не все связанные прокаты на определенный внешний веб-сайт аренды?

Текущее рассмотрение Единственное, что я могу придумать, - это добавить столбец базы данных с {external_website}_rental_id для указанного c внешнего веб-сайта, чтобы я мог сопоставить их. Однако это будет означать, что мне нужно добавить отдельный rental_id для каждого внешнего сайта аренды.

Код

rentals_controller.rb


def index
  shop = Shop.find(params[:id])
  request_rental_api
  @bikes = shop.bikes
end

private
def request_rental_api
    # set variables
    base_url = "https://www.rentalwebsite.com"
    url = "/rest/api/rentals"
    token = 'TOKEN'


    # init connection object
    connection = Faraday.new(:url => base_url) do |c|
       c.use Faraday::Request::UrlEncoded
       c.use Faraday::Response::Logger
       c.use FaradayMiddleware::FollowRedirects
       c.adapter Faraday::Adapter::NetHttp
    end

    # send request
    response = connection.get url do |request|
      request.headers["Authorization"] = token
      request.headers["Accept"] = "application/json"
    end
    bookings = JSON.parse(response.body['results'])

    # check if rental is unique, and if so save it.
    # Rental.create(????)
  end

JSON API вывода

{
  "next": null,
  "previous": null,
  "results": [
    {
      "activation_requested": false,
      "id": 21664,
      "slug": "rental-test"
      #more information....
   }
}]

1 Ответ

1 голос
/ 31 марта 2020

вы можете создать 2 столбца

provider_rental_id идентификатор, возвращенный в ответе JSON

provider имя провайдера, к которому был сделан запрос

Затем только создавать новые записи

rental_ids = bookings['results'].map { |r| r['id'] }
return if rental_ids.none?

existing_rental_ids = Rental.where(provider_rental_id: rental_ids, provider: 'Name of Provider').pluck(:provider_rental_id)
new_rental_ids = rental_ids - existing_rental_ids

new_rental_ids.each do |rental_id|
  Rental.create(
    provider: 'Name of Provider',
    provider_rental_id: rental_id, 
    ...

или если вы используете рельсы 6, вы можете проверить upsert_all
Примечание: он не создает экземпляры каких-либо моделей и не запускает активную запись обратные вызовы или проверки.

Дополнительно попробуйте переместить это в фоновый cronjob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...