首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用smarter_csv为API批量创建- Ruby on Rails

在 Ruby on Rails 中,使用 smarter_csv gem 可以方便地处理 CSV 文件,并将其数据批量导入到数据库中。以下是一个使用 smarter_csv 为 API 批量创建记录的示例步骤。

1. 添加 Gem

首先,确保在您的 Gemfile 中添加 smarter_csv

代码语言:javascript
复制
gem 'smarter_csv'

然后运行 bundle install 来安装它。

2. 创建 API 控制器

接下来,您需要创建一个 API 控制器来处理 CSV 文件的上传和处理。假设您要导入的模型是 User,您可以创建一个 UsersController

代码语言:javascript
复制
rails generate controller Api::Users

3. 设置路由

config/routes.rb 中,添加一个路由来处理 CSV 上传:

代码语言:javascript
复制
namespace :api do
  resources :users do
    collection do
      post :import
    end
  end
end

4. 实现导入逻辑

app/controllers/api/users_controller.rb 中,添加导入逻辑:

代码语言:javascript
复制
module Api
  class UsersController < ApplicationController
    def import
      if params[:file].nil?
        render json: { error: 'No file provided' }, status: :unprocessable_entity and return
      end

      begin
        # 使用 SmarterCSV 处理 CSV 文件
        options = { key_mapping: { name: :name, email: :email } } # 根据 CSV 文件的列名进行映射
        SmarterCSV.process(params[:file].path, options) do |chunk|
          # 批量创建用户
          User.insert_all(chunk.map { |row| row[:data] })
        end

        render json: { message: 'Users imported successfully' }, status: :ok
      rescue => e
        render json: { error: e.message }, status: :unprocessable_entity
      end
    end
  end
end

5. 处理 CSV 文件

确保您的 CSV 文件格式正确。例如,假设您的 CSV 文件内容如下:

代码语言:javascript
复制
name,email
John Doe,john@example.com
Jane Smith,jane@example.com

6. 测试 API

您可以使用 Postman 或 cURL 测试 API。以下是使用 cURL 的示例:

代码语言:javascript
复制
curl -X POST http://localhost:3000/api/users/import -F "file=@path/to/your/file.csv"

7. 处理错误和验证

在实际应用中,您可能需要添加更多的错误处理和数据验证。例如,您可以在插入之前检查电子邮件是否唯一,或者在处理 CSV 时捕获特定的错误。

8. 其他选项

smarter_csv 还提供了许多其他选项,例如:

  • 数据验证:在插入之前验证数据。
  • 自定义映射:根据需要自定义列名映射。
  • 处理大文件:使用 chunk_size 选项处理大文件。

示例代码

以下是完整的 UsersController 示例代码:

代码语言:javascript
复制
module Api
  class UsersController < ApplicationController
    def import
      if params[:file].nil?
        render json: { error: 'No file provided' }, status: :unprocessable_entity and return
      end

      begin
        options = { key_mapping: { name: :name, email: :email } }
        SmarterCSV.process(params[:file].path, options) do |chunk|
          User.insert_all(chunk.map { |row| row[:data] })
        end

        render json: { message: 'Users imported successfully' }, status: :ok
      rescue => e
        render json: { error: e.message }, status: :unprocessable_entity
      end
    end
  end
end
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券