You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby Seed实操:如何为sneaker存储多子类并去除重复数据?

问题根源

  1. 现有逻辑逐行遍历CSV时每次都会新建Sneaker实例,同一款鞋对应多条CSV记录的情况下,自然会生成多条重复数据。
  2. 后续尝试的逻辑存在两个错误:
    • row是CSV解析生成的CSV::Row对象,不是行索引,row += 1没有合法语义,无法实现切换到下一行的效果
    • while循环内部没有修改判断条件row['category'] == sub的相关变量,只要条件首次成立就会进入无限循环

修正方案

先对CSV数据按鞋名分组,聚合同一款鞋的所有子分类后再统一创建记录,避免重复生成实例。修正后的完整db/seeds.rb代码如下:

# db/seeds.rb
require 'csv'

csv_text = File.read(Rails.root.join('lib', 'seeds', 'air_jordan.csv'))
csv = CSV.parse(csv_text, headers: true, encoding: 'ISO-8859-1')
# 注意补全你用到的Mid分类到合法子分类列表中
air_jordan_subcategories = ['1', '11', "Jordan OFF-WHITE", "Future", "Women", "High", "Mid"]

# 按鞋名分组,聚合同一款鞋的所有子分类
sneaker_groups = csv.group_by { |row| row['Name'] }

sneaker_groups.each do |sneaker_name, rows|
  # 收集该款鞋所有符合要求的子分类,去重
  subcategories = rows.map { |row| row['Subcategory'] }
                      .uniq
                      .select { |sub| air_jordan_subcategories.include?(sub) }
  # 单款鞋仅创建一个实例
  Sneaker.create!(
    name: sneaker_name,
    subcategory: subcategories
  )
end

逻辑说明

  • group_by方法会将所有CSV行按Name字段分组,同一款鞋的所有行会被归到同一个数组中
  • 遍历分组时先聚合所有子分类,筛选出你定义的合法分类后去重,直接赋值给subcategory字段即可(如果该字段是PostgreSQL数组类型,直接赋值数组完全兼容)
  • 每款鞋只会生成一条数据库记录,符合你的预期

内容的提问来源于stack exchange,提问作者Thomas Mike Sarafian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 17:24:10