Сохранить запрос GraphQL из Shopify API в базе данных postgres

Вопрос: Как сохранить запрос GraphQL в мою локальную базу данных / базу данных postgres?

(предположим, я просто хочу сохранить одно или два поля - я сделаю больше, но я просто не уверен, как это сделать для начала.)

Фон:

  • У меня есть встроенное приложение shopify, которое работает с веб-перехватчиками для приема заказов. Я выполняю задание, и данные отлично хранятся в моей базе данных.

  • Я создал очень простое приложение, которое выполняет в модели запрос graphql. Я настроил его так, чтобы видеть объект json в представлении. Но я не на 100% понимаю, как я перехожу из запроса api graphql -> ответа (в модели - по крайней мере, на данный момент) -> сохранения атрибутов данных в мою базу данных

  • Я тестирую это как новое приложение. Итак, я не разделяю модели / контроллеры и т. Д., А пока использую только одну модель.

  • Думаю, я немного заблудился. Мне нужно запускать работу? Или это то, что я могу сделать в контроллере (или в модели).

Модель

shop.rb

class Shop < ActiveRecord::Base
  include ShopifyApp::ShopSessionStorage
  has_many :orders

  def api_version
    ShopifyApp.configuration.api_version
  end

  session = ShopifyAPI::Session.new(domain: "bryanbeshore.myshopify.com", token: Shop.first.shopify_token, api_version: "2020-04")
  ShopifyAPI::Base.activate_session(session)

  client = ShopifyAPI::GraphQL.client

  SHOP_NAME_QUERY = client.parse <<-'GRAPHQL'
      {
    shop {
      name
    }
    orders(first: 100) {
      edges {
        node {
          id
          name
          createdAt
          shippingAddress {
            address1
            address2
            city
            province
            provinceCode
            zip
          }
        }
      }
    }
    }
  GRAPHQL
end

Контроллер

home_controller.rb

class HomeController < AuthenticatedController

  def index
    client = ShopifyAPI::GraphQL.client
    @shop_orders = client.query(Shop::SHOP_NAME_QUERY).data.to_json
  end
end

Просмотр

приложение / просмотров / главная / index.html.erb

<p><%= @shop_orders %></p>

Текущая схема

ActiveRecord::Schema.define(version: 2020_05_06_181457) do

  create_table "orders", force: :cascade do |t|
    t.string "shopify_order_id", null: false
    t.string "shopify_order_name", default: ""
    t.datetime "shopify_order_created_at"
    t.integer "shop_id"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["shop_id"], name: "index_orders_on_shop_id"
    t.index ["shopify_order_id"], name: "index_orders_on_shopify_order_id", unique: true
  end

  create_table "shops", force: :cascade do |t|
    t.string "shopify_domain", null: false
    t.string "shopify_token", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["shopify_domain"], name: "index_shops_on_shopify_domain", unique: true
  end

end


person Bryan Beshore    schedule 19.05.2020    source источник


Ответы (1)


Вы запрашиваете Shop заказы, поэтому я бы создал таблицу Order model / orders, чтобы убедиться, что она принадлежит магазину.

  • rails g model Order payload:jsonb shop:references, в этом примере я просто создаю одно поле jsonb, в которое мы будем выгружать весь объект JSON.
  • rails db:migrate
  • Добавить belongs_to :shop в models/order.rb
  • Убедитесь, что Shop модель имеет этот has_many :orders, обычно рельсы добавляют его за вас

Теперь, когда вы получаете полезную нагрузку JSON из Shopify, прокрутите ее и создайте новую запись для каждого полученного вами заказа.

Итак, в методе, который вы используете для запроса заказов, добавьте это.

shopify_json_response.each do |item|
  orders.create(payload: item)
end

Более или менее, это должно помочь. Для этого вам не нужна фоновая работа, однако фоновые задания идеально подходят, когда вы хотите обрабатывать данные, которые не нужно обрабатывать сразу.

person Karim Tarek    schedule 20.05.2020
comment
это более или менее помогло. Что касается shopify_json_response.each do ..., который вы опубликовали, я немного сбит с толку. Разве я не должен просто опубликовать всю полезную нагрузку в базе данных postgres? Или ты что-то еще делаешь с этим? - person Bryan Beshore; 21.05.2020
comment
Это зависит от вашего варианта использования, я предполагаю, что вы хотите получать заказы из Shopify и хранить их в своей базе данных, чтобы вы могли использовать их позже для бизнес-логики, поэтому для каждого элемента в полезной нагрузке, которую вы получили от Shopify I Создаю новую локальную запись. Но если вы просто хотите сохранить всю полезную нагрузку, содержащую 100 заказов, возможно, создайте модель dump, и вы можете сделать Dump.new(payload: shopify_json_response), и вы сможете получить к ней доступ позже! Надеюсь, это поможет :) - person Karim Tarek; 23.05.2020