Ruby on rails 如何在CSV导入RubyonRails应用程序中自动设置某些行值

Ruby on rails 如何在CSV导入RubyonRails应用程序中自动设置某些行值,ruby-on-rails,Ruby On Rails,我有两种模式——交易模式和银行模式。每笔交易都属于银行 在我的银行显示视图文件中-我有一个表,其中包含与该银行帐户相关的所有交易。我已经在我的事务模型类中创建了一个导入函数,该函数运行良好,但我需要将某些行设置为特定的函数 我的事务中的CSV导入为: def self.import(file) CSV.foreach(file.path, headers: true) do |row| Transaction.create! row.to_hash end end 控制器看起来像:

我有两种模式——交易模式和银行模式。每笔交易都属于银行

在我的银行显示视图文件中-我有一个表,其中包含与该银行帐户相关的所有交易。我已经在我的事务模型类中创建了一个导入函数,该函数运行良好,但我需要将某些行设置为特定的函数

我的事务中的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

这很好,但是,因为有许多银行帐户,每个事务都需要有一个银行帐户id和用户id。我需要设置用户导入文件的位置的银行帐户id。因此,如果导入发生在银行id:1内,则导入将自动将银行帐户值设置为1。我不知道如何将用户id设置为等于当前用户id?

您应该将银行id和当前用户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

显然,您不能在模型层获取当前的_用户,因为模型层无法访问会话变量,所以您需要传递当前的_用户和bank_id

只是一个补充说明,以提高您的导入功能

只要看看这些,就知道这个选项的速度有多快。Model.create为其生成SQL,而不是单独的事务、提交和插入,而是在单个查询中处理

参考资料:-


谢谢你,加巴。当我尝试实现这个时,它给了我一个错误:错误的参数数量为1,预期为3。它引用了文件、bank_id、current_user_id参数。知道它为什么会这样做吗?@JeanMalan你能在控制器端显示你调用Transaction.import..的代码吗?我猜它的给出错误是因为你没有通过银行id,而控制器端的当前用户id,请交叉检查它应该是Transaction.importfile,银行id,当前用户id?我已经更新了控制器和帖子。我不确定我是否通过了这些properly@JeanMalan你给当前用户id=当前用户id=银行id=银行id的值分配了哪些交易将被完成吗?好吧,这就是我遇到的问题,我不知道如何设置用户所在的当前银行id,作为参数。谢谢Krupa:但是我如何将银行id设置为用户所在的当前银行id?你能分享你的控制器代码和路线吗?
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