Rails — запретить post-запросу создавать несколько строк из массива, сохраняя при этом данные

#ruby-on-rails #arrays #ruby #ruby-on-rails-4 #hash

#ruby-on-rails #массивы #ruby #ruby-on-rails-4 #хэш

Вопрос:

Я начну с того, что мои контроллеры создают действие:

 def create
    this_order = params[:line_items]
    this_order.each do |this|
        @order = Transaction.new
        @order.shopifyid = params[:id]
        @order.vartitle = this['variant_title']
        @order.save
    end
end
 

Если вы не знакомы с ShopifyAPI, это просто просмотр JSON-файла заказа и создание внутренней строки каждого заказа в моей таблице транзакций, на данный момент он просто сохраняет идентификатор заказа, а затем переходит в массив line_items и получает заголовок варианта для сохранения вместе с ним.

Это работает нормально, но, конечно, это создает новую строку для каждого элемента в заказе, когда я действительно хочу, чтобы он дал мне один заказ со всеми элементами в нем.

Это случай преобразования столбцов моей таблицы в массив хэшей? Или я упускаю другой способ сделать это?

Комментарии:

1. Нужные вам данные params[:line_items] . Если вы хотите, чтобы он сохранялся, но не нужны отдельные записи, вы можете сохранить весь этот хэш в поле в вашей базе данных при условии, что (а) ваша база данных поддерживает структуры JSON или (б) вы используете функцию serialize rails, которая автоматически преобразует хэш в строку и преобразует его обратно при чтении записи. Лично вам было бы лучше использовать модель Order has_many , записи которой находятся в OrderItem (таблица order_items),

2. params[:line_items] возвращает массив (из разных хэшей) с информацией о каждой строке в формате хэша, будет ли это по-прежнему работать?

3. Да, но посмотрите на ответ @gokulm.

Ответ №1:

Вы можете создать две модели Transaction и Item со следующими отношениями:

Транзакция

 has_many :items
 

Элемент

 belongs_to :transaction
 

Действие вашего контроллера:

 def create
    @order = Transaction.new
    @order.shopifyid = params[:id]
    this_order = params[:line_items]
    this_order.each do |this|
        @order.items.new( #Item attributes )
    end
    @order.save
end
 

Я думаю, что таким образом вы можете иметь variant_title в таблице элементов.

Ответ №2:

Я не очень знаком с shopyify, но похоже, что ваша проблема связана только с тем фактом, что вы создаете новый объект для каждой позиции в результате того, где вы размещаете транзакцию.новый вызов. Другой способ организовать это — просто иметь другую таблицу для позиций. Вы могли бы сохранить этот хэш позиций в базе данных, но, скорее всего, вам захочется выполнить какие-то запросы, основанные на позициях, и пройти процесс сериализации этого столбца для каждой транзакции — это не эффективное по времени решение. Решение Goku соответствует тому, о чем я говорю