如果存在,则构建嵌套属性将数量增加1

时间:2016-01-20 15:33:23

标签: ruby-on-rails

我的表单设置如下:

<%= simple_form_for @line_item do |f| %>
  <%= f.input :product_id, as: :hidden, input_html: { value: @product.id } %>

    <%= f.simple_fields_for :line_item_attributes do |attributes_form| %>
      <%= attributes_form.association :product_attribute, collection: @product.product_attributes %>
    <% end %>

    <%= f.button :submit %>
<% end %>

我的创建操作如下所示:

  def create
    product = Product.find(params[:line_item][:product_id])
    @line_item = @cart.line_items.build(product: product)

    respond_to do |format|
      if @line_item.save
        format.html { redirect_to @line_item, notice: 'Line item was successfully created.' }
        format.json { render :show, status: :created, location: @line_item }
      else
        format.html { render :new }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

现在我基本上想扩展它,以便为line_item构建嵌套属性。小问题是如果项目已经存在我希望记录不被创建,而是+ = 1.我想我可能要创建一个方法,任何人都有任何想法?

1 个答案:

答案 0 :(得分:0)

您可能不需要额外的方法。

def create
  product = Product.find(params[:line_item][:product_id])
  @line_item = @cart.line_items.build do |line_item|
    line_item.product = product 
    line_item.product_attribute = ProductAttribute.where(...).first || line_item.build_product_attribute()
  end

  ...
end

line_item.product_attribute = ProductAttribute.where(...).first || line_item.build_product_attribute()行根据product_attribute中提供的条件分配现有where(...)。如果找不到,我们会使用product_attribute构建新的line_item.build_product_attribute