Rails вставьте столбец с идентификатором при импорте в CSV - PullRequest
0 голосов
/ 02 октября 2019

Итак, у меня есть следующее в моей модели Occupant:

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 принадлежит_Обору обучения и событиетребуется. Теперь пользователи будут импортировать список данных, в которых НЕ присутствует training_event_id. Как мне обновить / добавить столбец текущего training_event_id в CSV?

Я возился с гемом activerecord-import, но та же проблема заключается в том, что я не могу понять, как добавить втекущий идентификатор TrainingEvent для метода, который находится в модели.

EDIT:

Форма для импорта существует в Admin> TrainingEvent> Show и имеет:

=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, но я предполагаю, что он не применяет фактический идентификатор к файлу.

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

В конце концов я понял это, надеюсь, это поможет кому-то еще. В итоге я добавил гем 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

Admin> TrainingEvent> Show

=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'
0 голосов
/ 03 октября 2019

Мое предложение состоит в том, чтобы переместить логику импорта в модель training_event, поскольку вы можете использовать ассоциацию belongs_to, поэтому код более читабелен.

OccupantsController:

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

TrainingEvent:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...