#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, которая автоматически преобразует хэш в строку и преобразует его обратно при чтении записи. Лично вам было бы лучше использовать модель Orderhas_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 соответствует тому, о чем я говорю