2016-04-12 5 views
0

Я заполняю массив с несколькими элементами (некоторые из них равны, вот чего я хочу). Мой код-то вроде этого:Резервный массив с дублирующимися элементами

def create 
@order = Order.create() 
@order.table = Table.find_by(:number => params['table'][0]) 
@products ||= [] 
@qtd = [] 
Product.all.each do |product| 
    params['order'].each_pair do |ordered| 
    if(product.id.to_s == ordered.first) 
     for i in 0..ordered.second[0].to_i 
     @order.products << product 
     @order.save 
     end 
    end 
    end 
end 

binding.pry #here the @order.products is the way I want to 

if @order.save 
    flash[:success] = "Pedido criado com sucesso." 
    redirect_to tables_path 
else 
    flash[:danger] = "Erro ao criar pedido." 
    render :new 
end 
end 

Но когда я иду на рельсы консоли и сделать Order.last.products он dosen't показать мне де дублированные элементы, как я сэкономил на моем контроллере. Что происходит?

ответ

1

Ну в вашем случае вы должны посылать информацию о заказе от клиента к серверу, как

"order"=>{"line_items_attributes"=>{"0"=>{"quantity"=>"4", "id"=>"127"}}} 

Вместо того чтобы повторять product идентификатор в списке, вам следует реализовать концепцию line items в вашей системе. Line Items - это объекты, представляющие элементы, которые добавляются в вашу корзину и вместо повторения product_id вы можете использовать термин quantity.

Теперь у вас может быть отдельная модель под названием LineItem. Order может иметь много LineItem s. LineItem имеет много products.

Для получения дополнительной информации см What is a "order line"?


Для текущей реализации:

<< метод не позволяет повторяющихся записей. Он отфильтровывает дубликаты. В основном это относится к products с order, так как order может иметь несколько products через some_table. Он не может относиться к одному product к order дважды.

Мое предложение было бы, создайте поле string (столбец) под названием products и добавьте сериализованный массив идентификаторов продуктов.

order.products = [1, 1, 3, 4,4,4].to_s 

при доступе к вам де-сериализовать.

+0

Первое решение работает так, как я хотел! Спасибо :) –

Смежные вопросы