首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails如何在使用外部API创建数据时保存数据?

Rails如何在使用外部API创建数据时保存数据?
EN

Stack Overflow用户
提问于 2020-03-30 17:13:37
回答 1查看 777关注 0票数 1

在我的bike_rental_shops应用程序中,我让这些商店能够管理他们的自行车租赁。

上下文自行车租赁公司也提供他们的自行车在网站上的外部各方,因此我连接我的Rails应用程序与这些外部网站。当用户转到索引页面时,我正在我的控制器中处理这个问题。在加载索引页之前,对外部租赁网站进行API调用,并将新的自行车租赁保存在数据库中。

问题如何只保存新的租金,而不是所有的租金链接到某个外部租赁网站?

当前考虑的我唯一能想到的就是为特定的外部网站添加一个带有{external_website}_rental_id的数据库列,这样我就可以匹配它们了。但是,这意味着我需要为每个外部租赁网站添加一个独立的rental_id。

rentals_controller.rb

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "next": null,
  "previous": null,
  "results": [
    {
      "activation_requested": false,
      "id": 21664,
      "slug": "rental-test"
      #more information....
   }
}]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-31 03:31:09

您可以创建2列

provider_rental_id id返回响应JSON

提供者的provider名称,向其提出请求的提供者

则只创建新记录。

代码语言:javascript
复制
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, 
    ...

如果您使用的是rails 6,则可以检查

注意:它不实例化任何模型,也不触发活动记录回调或验证。

另外,尝试将其移到后台cronjob中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60935839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档