gpt4 book ai didi

ruby-on-rails - 比较 csv 列和 ActiveRecord 对象

转载 作者:数据小太阳 更新时间:2023-10-29 08:57:10 25 4
gpt4 key购买 nike

我有一个简单的 csv(电子邮件列表),我想将其上传到我的 Rails 后端 API,如下所示:

abd@gmail.com,cool@hotmail.com

我想要的是上传该文件,检查用户表中是否有匹配的行(根据电子邮件地址),然后返回一个新的可下载的 csv,其中包含 2 列:电子邮件以及电子邮件是否是与现有用户匹配( bool 值 true/false)。

我想流式传输输出,因为文件可能非常大。这是我目前所拥有的:

Controller

  def import_csv
send_data FileIngestion.process_csv(
params[:file]
), filename: 'processed_emails.csv', type: 'text/csv'
end

file_ingestion.rb

require 'csv'
class FileIngestion

def self.process_csv(file)
emails = []
CSV.foreach(file.path, headers: true) do |row|
emails << row[0]
end
users = User.where("email IN (?)", emails)
end
end

谢谢!

最佳答案

为什么不直接从用户那里提取所有电子邮件并执行类似的操作。这个例子保持简单,但你明白了。如果我们可以假设您的输入文件只是一串以逗号分隔值的电子邮件,那么这应该可行:

emails = File.read('emails.csv').split(',')

def process_csv(emails)
user_emails = User.where.not(email: [nil, '']).pluck(:email)
CSV.open('emails_processed.csv', 'w') do |row|
row << ['email', 'present']
emails.each do |email|
row << [email, user_emails.include?(email) ? 'true' : 'false']
end
end
end

process_csv(emails)

已更新以匹配您的代码设计:

def import_csv
send_data FileIngestion.process_csv(params[:file]),
filename: 'processed_emails.csv', type: 'text/csv'
end

require 'csv'
class FileIngestion

def self.process_csv(file)
emails = File.read('emails.csv').split(',')
CSV.open('emails_processed.csv', 'w') do |row|
emails.each do |email|
row << [email, user_emails.include?(email) ? 'true' : 'false']
end
end
File.read('emails_processed.csv')
end
end

关于ruby-on-rails - 比较 csv 列和 ActiveRecord 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49669557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com