Rails插入ID为导入CSV的列

时间:2019-10-02 18:29:32

标签: ruby-on-rails

所以我的乘员模型上有以下内容:

def self.import(file)
 CSV.foreach(file.path, headers: true, header_converters: :symbol) do |row|
  Occupant.create! row.to_h
 end
end

在我的OccupantController中,

def new
 @occupant = Occupant.new(training_event_id: occupant_params[:training_event_id])
 respond_with @occupant
end
def import
 occupant = Occupant.import(params[:file])
 respond_with @occupant
end

我添加了一个新方法,只是为了表明Occupant属于TrainingEvent,并且training_event_id是必需的。现在,用户将导入不包含training_event_id的数据列表。如何将当前training_event_id的列更新/添加到CSV?

我一直在弄混activerecord-import宝石,但是存在相同的问题,因为我无法弄清楚如何将TrainingEvent的当前ID添加到模型上的方法中。

编辑:

用于导入的表单位于管理> TrainingEvent>显示中,并且具有:

=form_tag import_admin_occupants_path, multipart: true do
 =hidden_field_tag :training_event_id, value: @occupant.training_event_id
 =file_field_tag :file
 =submit_tag 'Import'

我想也许我可以在这里插入training_event_id,但是我猜想它没有将实际ID应用于文件。

2 个答案:

答案 0 :(得分:0)

我的建议是将导入逻辑移至belongs_to模型,因为您可以利用def show @occupant = Occupant.new(training_event_id: occupant_params[:training_event_id]) respond_with @occupant end def import @training_event = TrainingEvent.find_by(training_event_id: params[:training_event_id]) @training_event.import(params[:file]) respond_with @training_event.occupants end 关联,因此代码更具可读性。

OccupantsController:

# instance method instead of class method
def import(file)
 CSV.foreach(file.path, headers: true, header_converters: :symbol) do |row|
  self.occupants.create row.to_h
 end
end

培训活动:

  selectedProductSuppliers$ = this.selectedProduct$
    .pipe(
      filter(selectedProduct => Boolean(selectedProduct)),
      switchMap(selectedProduct =>
        forkJoin(selectedProduct.supplierIds.map(supplierId => this.http.get<Supplier>(`${this.suppliersUrl}/${supplierId}`)))
      )
    );

答案 1 :(得分:0)

最终我弄清楚了,希望对其他人有帮助。我最终添加了activerecord-import宝石,并做了一些小调整。表单实际上会将当前的training_event_id作为隐藏文件拉出,因此我将该参数传递给模型/控制器。

当前唯一仍然存在的问题是导入后才能上线。但这是另一回事。

人员模型:

def self.my_import(file, training_event)
 occupants = []
 CSV.foreach(file.path, headers: true, header_converters: :symbol) do |row|
   row['training_event_id'] = training_event
   occupants << Occupant.new(row.to_h)
   occupants.save
 end
 Occupant.import occupants
end

乘员控制器:

def import
 @occupant = Occupant.my_import(params[:file], params[:training_event_id])
 respond_with @occupant, location: admin_training_event_path(@occupant.training_event)
end

管理员> TrainingEvent>显示

=form_tag import_admin_occupants_path, multipart: true do
 =hidden_field_tag "training_event_id", @training_event.id
 =file_field_tag :file
 =submit_tag 'Import'