Rails: получить вложенный JSON и отправить только значение в базу данных - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время я могу отправить вложенный атрибут из JSON в мою базу данных в rails.В этом случае «клиент» его «идентификатор», когда клиент размещает заказ.Я сохраняю только несколько атрибутов из большого файла JSON в таблицу в рельсах.

Текущая ситуация

|          customer          |
+----------------------------+
| {"id"=>115310627314723954} |
| {"id"=>115310627314723954} |
| {"id"=>115310627314723954} |

Желаемая ситуация

|      customer      |
+--------------------+
| 115310627314723954 |
| 115310627314723954 |
| 115310627314723954 |

укороченный JSON от webhook

{
"id": 820982911946154508,
"email": "jon@doe.ca",
"total_price": "403.00",
"subtotal_price": "393.00",
"customer": {
  "id": 115310627314723954,
  "email": "john@test.com",
  "accepts_marketing": false,
 }
}

укороченный контроллер

def order_params
  params.permit(
    :total_price,
    :currency,
    customer: :id
  )
end

укороченный 20181202165620_create_orders.rb

class CreateOrders < ActiveRecord::Migration[5.2]
  def change
    create_table :orders, {id: false} do |t|
      t.float :total_price
      t.string :customer

      t.timestamps
    end
  end
end

Примечание. Я почти уверен, что где-то нашел ответ, но пока не могу его понять из-за своего уровня знаний.Пробовал и искал около 4 часов.Если кто-то сможет указать мне правильное направление, исходя из моей ситуации, это будет высоко оценено.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Если я правильно понял, вы не можете изменить структуру JSON с webhook, это запрос от какого-то внешнего API?И у вас есть внешний customer_id для каждого пользователя в вашем приложении, и вы хотите создать связь между заказами и пользователями, использующими его?Давайте попробуем что-то вроде этого:

  • вам нужно проиндексировать поле bigint customer_id в таблице пользователей.Я не знаю, что у вас сейчас для этого, просто измените тип или добавьте индекс, или, может быть, это уже нормально
  • добавьте user_id поле к таблице заказов

    add_reference :orders, :user, foreign_key: true
    
  • удалить строку customer поле из таблицы заказов

  • добавить ассоциации к моделям пользователей и заказов.Для заказа belongs_to :user, Пользователь has_many :orders
  • найдите нужного пользователя в контроллере и добавьте его к заказу

    def create
      user = User.find_by(customer_id: params[:customer][:id])
      @order = Order.new(order_params)
      @order.user_id = user.id
      if @order.save
        # success story goes here
      else
        # some redirect or re-render logic
      end
    end
    
    def order_params
      params.permit(:total_price, :currency)
    end
    

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

0 голосов
/ 03 декабря 2018

В модель заказа добавьте следующие коды:

before_save :set_customer_id

private

def set_customer_id
    self.customer = customer['id']
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...