Как автоматически установить определенные значения строк в CSV-импорте в приложение Ruby on Rails - PullRequest
0 голосов
/ 25 июня 2018

У меня есть две модели - Транзакция и Банк. Каждая транзакция принадлежит банку.

В моем файле банковского представления - у меня есть таблица со всеми транзакциями, связанными с этим банковским счетом. Я создал функцию импорта в своем классе модели транзакций, которая работает хорошо, но мне нужно установить определенные строки для определенных функций.

CSV-импорт в моей транзакции:

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
  Transaction.create! row.to_hash
 end
end

Контроллер выглядит так:

def import
  Transaction.import(params[:file], bank_id, current_user_id)
  redirect_to :back, notice: "Tramsactions imported."
  end

Это хорошо работает, однако, поскольку существует много банковских счетов, каждая транзакция должна иметь bank_account_id и user_id. Мне нужно установить bank_account_id, откуда пользователь импортирует файл. Поэтому, если импорт происходит внутри идентификатора банка: 1 - импорт автоматически установит значение банковского счета в 1. И я не уверен, как установить user_id равным текущему user_id?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Определенно, вы не можете получить current_user на уровне модели, так как переменные сеанса недоступны для уровня модели, поэтому вам нужно будет передать current_user и bank_id

Просто примечание для повышенияваши функции импорта.

ActiveRecord.import

def self.import(file, bank_id, current_user_id)
  transactions = []
  CSV.foreach(file.path, headers: true) do |row|
    transaction_params = row.to_hash.merge!({bank_id: bank_id, user_id: current_user_id})
    transactions << Transaction.new(transaction_params)
  end
  Transaction.import(transactions) 
end

Просто взгляните на эти тесты , чтобы понять, насколько быстрееэтот вариант есть.Вместо отдельных транзакций, фиксации и вставки, для которых Model.create генерирует SQL, он обрабатывает его в одном запросе.

Ссылки: -

https://github.com/zdennis/activerecord-import/wiki

https://github.com/zdennis/activerecord-import/wiki/Requiring

https://www.rubydoc.info/gems/activerecord-import/ActiveRecord/Base

0 голосов
/ 25 июня 2018

вы должны передать bank_id и current_user_id этой функции, а затем вы можете использовать следующий код,

def self.import(file, bank_id, current_user_id)
  CSV.foreach(file.path, headers: true) do |row|
    transaction_params = row.to_hash.merge!({bank_id: bank_id, user_id: current_user_id})
    Transaction.create! transaction_params
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...