Как сопоставить записи из входящего webhook с записями локальных моделей? - PullRequest
0 голосов
/ 07 июня 2019

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

Вот задание на работу в сети:

..
    shop = Shop.find_by(shopify_domain: shop_domain)
    shop.with_shopify_session do
      line_items = webhook[:line_items]
      line_items.each do |item|
        variant_id = item[:variant_id]
        product_id = item[:product_id]
      @shop = Shop.find_by(shopify_domain: shop_domain)
      @shop_products = ShopProduct.where(shop_id: shop.id)

      @shop_products.each { |s| shop_store_products = s.store_product_id
        if shop_store_products == product_id
          @order = Order.new(store_product_id: product_id, shop_order_id: webhook[:id], location_id: webhook[:location_id], shop_product_id: s.product_id)
          @order.shop_id = @shop.id
          @order.save!
        end
      }
      end

..

Веб-крючок в порядке. Когда я удаляю операторы .each и if, ордер сохраняется, но все ордера сохраняются, и мне нужно отфильтровать их только к совпадающим, как описано ниже.

Я хочу, чтобы это входило в мою модель заказов, только если ShopProduct.store_product_id совпадает с входящим product_id

Эти два значения должны совпадать, как если бы я создавал / сохранял ShopProduct, он принесет соответствующий product_id.

У меня есть эти записи в моей базе данных, так что это не проблема.

Вот мои модели:

**shop.rb**

belongs_to :shop_products
belongs_to :user

**shop_product.rb**

belongs_to :product
has_one :shop
has_one :order

**order.rb**

belongs_to :product
belongs_to :shop_product

Схема:

create_table "orders", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "shop_order_id"
    t.string "shop_product_id"
    t.string "location_id"
    t.integer "shop_id"
    t.string "tracking_numbers"
    t.string "store_product_id"
  end

create_table "shop_products", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "product_id"
    t.string "store_product_id"
    t.integer "shop_id"
  end

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

Цель: Создать заказ на каждый соответствующий идентификатор product_id для входящего в ShopProduct.store_product_id.

Вопрос: Как я могу получить желаемый результат?

Например, я не могу получить массив @ shop_product.store_product_id's ... Даже в консоли я не могу, это приводит только к следующему:

irb(main):009:0> shop_products.each { |s| sp = s.store_product_id }
=> [#<ShopProduct id: 1, created_at: "2019-06-06 23:45:04", updated_at: "2019-06-06 23:45:04", product_id: 1, store_product_id: "1965852786737", shop_id: 1>, #<ShopProduct id: 2, created_at: "2019-06-07 01:50:15", updated_at: "2019-06-07 01:50:15", product_id: 1, store_product_id: "1234567890", shop_id: 1>]
irb(main):010:0> sp
Traceback (most recent call last):
        1: from (irb):10
NameError (undefined local variable or method `sp' for main:Object)
irb(main):011:0> 

Разве sp не должен выводить массив совпадающих записей?

1 Ответ

0 голосов
/ 07 июня 2019

Если я правильно понял, это,

..
    shop = Shop.find_by(shopify_domain: shop_domain)
    shop.with_shopify_session do
      line_items = webhook[:line_items]
      line_items.each do |item|
        variant_id = item[:variant_id]
        product_id = item[:product_id]
      @shop = Shop.find_by(shopify_domain: shop_domain)
      @shop_products = ShopProduct.where(shop_id: shop.id)

      unless @shop_products.blank?
        @shop_products.each do |shop_product|
          if shop_product.store_product_id.eql?(product_id)
            @order = Order.new(store_product_id: product_id, shop_order_id: webhook[:id], location_id: webhook[:location_id], shop_product_id: shop_product.product_id)
            @order.shop_id = @shop.id
            @order.save!
          end
        end
      end
..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...