再現:\n\n- ABC という名前のタグを持つ\n- abc というタグを持つ CSV を作成する\n- /tags に移動して CSV をアップロードする\n- 「申し訳ありませんが、foo.csv のアップロード中にエラーが発生しました。もう一度お試しください。」というエラーが表示される\n\nこれは、タグが大文字と小文字を区別するが、大文字と小文字を無視して一意でなければならないため発生します。\n\n1000 個のタグを含むファイルがある場合、どこで問題が発生するかを特定するのはかなりの作業です。\n\ncode はこれを実行します\n\nrb\ntag = Tag.find_by_name(tag_name) || Tag.create!(name: tag_name)\n...\ntag_group = TagGroup.find_by(name: tag_group_name) || TagGroup.create!(name: tag_group_name)\n\n\nこれは悪いパターンです。find_by_name は大文字と小文字を区別しますが、create! は区別しないため [^1]、ActiveRecord::RecordInvalid : Validation failed: Name has already been taken というエラーが発生します。\n\nこれは次のようなものにするべきです。\n\ntag = Tag.where('name ILIKE ?', tag_name).first || Tag.create!(name: tag_name)\n\n\n[^1]: validates :name, presence: true, uniqueness: { case_sensitive: false } のため
ご報告ありがとうございます。これには pr-welcome を付けて、find_by_name を大文字小文字を区別しない検索にする必要があると思います。
以下のような状況です。
修正は以下のようになります。
TAG = Tag.where('lower(name) = ?', tag_name.downcase).first
TagGroup にはインデックスがありませんので、追加して、そこでも同様の処理を行う必要があります。
@RGJ様
通常のタグでは問題を再現できませんでしたが、タググループではご指摘のエラーが発生しました。
以下は私のサンプルCSVです。
ABC,TAGGROUP
ABCは正常に動作しますが、tag_groupではエラーが発生します。サンプルCSVを共有していただければ、喜んでお手伝いさせていただきます。
タググループの問題を修正するPRを作成しました。また、フォーラムでSiteSetting.force_lowercase_tagsは有効になっていますか?
いいえ、チェックされていません。すみません、今ならそれが重要だとわかります。
どのように再現しようとしているのかわかりませんが、CSV には小文字の abc が含まれ、force_lowercase_tags はチェックされていない必要があります。
心配いりません。コードを調べているときに見つけたサイトの設定でした。重要かもしれません!
CSVは、タググループなしのabcだけですか?
私たちのテスト例は次のとおりです(ローカルでテストしましたが、capitaltag2が大文字でしたが、期待どおりに動作しました)。
タグだけでは再現できませんでした。
私のOPに小さな間違いがありました。
Tag.find_by_name は大文字小文字を区別しません(良い)が、Tag.find_by(name: ) は大文字小文字を区別します(悪い)。
これは、David が7年前に find_by_name メソッドをオーバーライドすることで タグを修正した ためです。
TagGroup については、この修正は適用されていません。