que é um padrão ruim, já que find_by_name diferencia maiúsculas de minúsculas e create! não [1], então ele falha com ActiveRecord::RecordInvalid : Validation failed: Name has already been taken
Isso deveria ser algo como
tag = Tag.where('name ILIKE ?', tag_name).first || Tag.create!(name: tag_name)
porque validates :name, presence: true, uniqueness: { case_sensitive: false }↩︎
Obrigado por relatar, coloque um pr-welcome nisso, acho que precisamos mudar esse find_by_name para fazer uma busca que não diferencie maiúsculas de minúsculas.
Dado que temos:
A correção seria:
TAG = Tag.where('lower(name) = ?', tag_name.downcase).first
TagGroup está sem o índice, então precisaríamos adicioná-lo e fazer o mesmo lá.
Eu de fato não consigo reproduzir apenas com uma tag.
Cometi um pequeno erro na minha OP:
Tag.find_by_name não diferencia maiúsculas de minúsculas (bom) e Tag.find_by(name: ) diferencia maiúsculas de minúsculas (ruim).
Isso ocorre porque David já corrigiu para tags 7 anos atrás, substituindo o método find_by_name.