【问题标题】:Rails saving array with the duplicated elements带有重复元素的 Rails 保存数组
【发布时间】:2016-08-02 08:49:53
【问题描述】:

我正在用多个元素填充一个数组(其中一些是相等的,这就是我想要的)。我的代码是这样的:

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

但是当我去 Rails 控制台并执行 Order.last.products 时,他不会向我显示我保存在控制器上的重复元素。发生什么事了?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    在您的情况下,您应该将订单信息从客户端发送到服务器,例如

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

    您应该在系统中实现line items 的概念,而不是在列表中重复product id。 Line Items 是表示添加到购物车中的项目的对象,您可以使用术语 quantity 而不是重复 product_id

    现在您可以拥有名为LineItem 的单独模型。 Order 可以有多个 LineItems。 LineItem 有很多 products

    更多信息见What is a "order line"?


    对于当前的实施:

    &lt;&lt; 方法不允许重复条目。它过滤掉重复项。它基本上将productsorder 相关联,因为order 可以通过some_table 拥有多个products。它不能将相同的productorder 关联两次。

    我的建议是,创建一个名为 productsstring 字段(列)并添加产品 ID 的序列化数组。

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

    访问时反序列化。

    【讨论】:

    • 第一个解决方案按我想要的方式工作!谢谢你:)
    猜你喜欢
    • 2018-01-19
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多