首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批量添加项目rails 6

批量添加项目rails 6
EN

Stack Overflow用户
提问于 2020-10-05 15:25:15
回答 1查看 48关注 0票数 0

我有一个小项目管理应用程序。

在应用程序中,我有一个项目,项目和交付模型。

代码语言:javascript
复制
class Project < ApplicationRecord
    has_many :locations, dependent: :destroy
    has_many :items, dependent: :destroy
    has_many :deliveries, dependent: :destroy
end

class Item < ApplicationRecord
  belongs_to :project
  belongs_to :location, optional: true
  has_many :delivery_items, dependent: :destroy
  has_many :deliveries, through: :delivery_items

  enum status: [:unscheduled, :scheduled, :delivered]
end

class Delivery < ApplicationRecord
  belongs_to :project
  has_many :delivery_items, dependent: :destroy
  has_many :items, through: :delivery_items

  enum status: [ :unapproved, :approved, :scheduled ]
end

我还有一个delivery_item连接表

代码语言:javascript
复制
class DeliveryItem < ApplicationRecord
  belongs_to :delivery
  belongs_to :item
end

我已经添加了一个名为location的新模型,这是一种将项目中的项分类到一个组中的方法。

代码语言:javascript
复制
class Location < ApplicationRecord
  belongs_to :project
  has_many :items
  has_many :part_numbers, through: :items

  def bulkadd(delivery)
    self.items.each do |row|
      batch << Product.new(row)
    end
  end
end

此时,用户通过页面上的表单将项目单独添加到快递中

代码语言:javascript
复制
<h6>Add to Delivery</h6>
<%= form_for @delivery_item, html: {class: 'form-inline'} do |form| %>

  <div class="form-group">
    <%= form.collection_select :delivery_id, @project.deliveries.all, :id, :date, placeholder: 'Add to Delivery', class: 'form-control' %>
  </div>
    <%= form.hidden_field :item_id, value: item.id %>
  
  <div class="form-group">
    <%= form.submit "Add",class: 'btn btn-primary' %>

  </div>
<% end %>

我想通过添加一个批量添加按钮到每个位置来简化该过程,该按钮将添加所有相关的项目,以交付选定的多个项目。

我知道我需要delivery_item(送货,物品)。

我就是不能让最后的部分在我的大脑里工作

EN

回答 1

Stack Overflow用户

发布于 2020-10-06 18:31:13

在创建has_manyhas_and_belongs_to_many关联时,请使用宏creates an others_ids setter/getter。在本例中为item_ids=,它将自动在连接表中添加/删除行。

它很容易与form option helpers一起使用,以创建用户可以选择多个记录的select:

代码语言:javascript
复制
<%= form_for(@delivery) do |form| %>
  <div class="field">
    <%= f.label :item_ids, 'Select the items' %>
    <%= f.collection_select :item_ids, @items, :id, :name, multiple: true %>
  </div>
<% end %>

或者如果您喜欢复选框,请执行以下操作:

代码语言:javascript
复制
<%= form_for(@delivery) do |form| %>
  <div class="field">
    <%= f.label :item_ids, 'Select the items' %>
    <%= f.collection_check_boxes :item_ids, @items, :id, :name %>
  </div>
<% end %>

:name替换为要用于选项文本的任何属性。

代码语言:javascript
复制
class DeliveriesController < ApplicationController
  before_action :set_delivery, only: [:show, :edit, :update, :destroy]
  # This avoids a database query in the view
  before_action :set_items, only: [:new, :edit]

  # POST /deliveries
  def create
    @delivery = Delivery.new(delivery_params)
    if @delivery.save
      redirect_to @delivery, notice: 'Delivery created'
    else
      set_items
      render :new
    end
  end

  # PUT|PATCH /deliveries/1
  def update
    if @delivery.update(delivery_params)
      redirect_to @delivery, notice: 'Delivery updated'
    else
      set_items
      render :edit
    end
  end

  private
 
  def set_delivery
    @delivery = Delivery.find(params[:id])
  end

  def set_items
    @items = Item.all
  end

  def delivery_item_params
    # Passing the hash `item_ids: []` allows an array of permitted scalar types.
    params.require(:delivery)
          .permit(:foo, :bar, :baz, item_ids: [])
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64204116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档