我有一个小项目管理应用程序。
在应用程序中,我有一个项目,项目和交付模型。
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连接表
class DeliveryItem < ApplicationRecord
belongs_to :delivery
belongs_to :item
end我已经添加了一个名为location的新模型,这是一种将项目中的项分类到一个组中的方法。
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此时,用户通过页面上的表单将项目单独添加到快递中
<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(送货,物品)。
我就是不能让最后的部分在我的大脑里工作
发布于 2020-10-06 18:31:13
在创建has_many或has_and_belongs_to_many关联时,请使用宏creates an others_ids setter/getter。在本例中为item_ids=,它将自动在连接表中添加/删除行。
它很容易与form option helpers一起使用,以创建用户可以选择多个记录的select:
<%= 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 %>或者如果您喜欢复选框,请执行以下操作:
<%= 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替换为要用于选项文本的任何属性。
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
endhttps://stackoverflow.com/questions/64204116
复制相似问题