# 标签/标签组 CSV 导入区分大小写，但事实并非如此

**URL:** <https://meta.discourse.org/t/tag-taggroup-csv-import-is-case-aware-but-its-not/381450>\
**Category:** Bug\
**Tags:** pr-welcome\
**Created:** [2025年九月3日 16:19 UTC](https://meta.discourse.org/t/tag-taggroup-csv-import-is-case-aware-but-its-not/381450 "2025-09-03T16:19:17Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)\
**Post date:** [2025年九月3日 16:19 UTC](https://meta.discourse.org/t/tag-taggroup-csv-import-is-case-aware-but-its-not/381450/1 "2025-09-03T16:19:17Z")

</div>

复现：

- 拥有一个名为 ABC 的标签
- 创建一个带有标签 abc 的 CSV
- 转到 /tags 并上传 CSV
- 查看上传失败，显示“抱歉，上传 foo.csv 时出错。请重试。”

这是因为标签区分大小写，但它们必须在忽略大小写的情况下是唯一的。

如果您的文件包含 1000 个标签，那么找出问题所在将是一项艰巨的任务。

[code](https://github.com/discourse/discourse/blob/main/app/controllers/tags_controller.rb#L250-L267) 中的代码是这样做的：

```rb
TAG = Tag.find_by_name(tag_name) || Tag.create!(name: tag_name)
...
TagGroup = TagGroup.find_by(name: tag_group_name) || TagGroup.create!(name: tag_group_name)

```

这是一个糟糕的模式，因为 `find_by_name` 区分大小写而 `create!` 不区分大小写 [^1]，因此会因 `ActiveRecord::RecordInvalid : Validation failed: Name has already been taken` 而出错。

这应该类似于：

`tag = Tag.where('name ILIKE ?', tag_name).first || Tag.create!(name: tag_name)`

[^1]：因为 `validates :name, presence: true, uniqueness: { case_sensitive: false }`

---

_[View the full topic](https://meta.discourse.org/t/tag-taggroup-csv-import-is-case-aware-but-its-not/381450)._
