Faltan restricciones NOT NULL y de unicidad en la BD

Hola,

Quería reportar algunas validaciones/restricciones que existen en los modelos pero que faltan en la base de datos.

Requisitos de no nulo faltantes

PostDetail - key, value son obligatorios en el modelo, pero son nullable en la base de datos.

  1. Obligatorio en el modelo (app/models/post_detail.rb):

    validates_presence_of   :key, :value
    

    …Pero nullable en la base de datos

    discourse_development=# \d post_details
                                            Table "public.post_details"
       Column   |            Type             | Collation | Nullable |                 Default
    ------------+-----------------------------+-----------+----------+------------------------------------------
     ...
     key        | character varying           |           |          |
     value      | character varying           |           |          |
    

    Si añadimos una restricción NOT NULL a la base de datos, aún es posible que pase una cadena vacía, pero creo que tener not null será al menos un poco más seguro.

Restricciones de unicidad faltantes

  1. TagGroup - name. Único en el modelo (app/models/tag_group.rb)

    validates_uniqueness_of :name, case_sensitive: false
    

    Pero falta el índice único en la base de datos

    discourse_development=# \d tag_groups
    ...
    Indexes:
        "tag_groups_pkey" PRIMARY KEY, btree (id)
    
  2. De igual manera, WatchedWord - word. (app/models/watched_word.rb)

    validates :word,   presence: true, uniqueness: true, length: { maximum: 50 }
    

    La base de datos tiene un índice único en (action, word) pero no en (word) solo:

    discourse_development=# \d watched_words
    ...
    Indexes:
        "watched_words_pkey" PRIMARY KEY, btree (id)
        "index_watched_words_on_action_and_word" UNIQUE, btree (action, word)
    
  3. Finalmente, WebHookEventType - name. (app/models/web_hook_event_type.rb):

    validates :name, presence: true, uniqueness: true
    

    Falta la restricción única en la base de datos:

    discourse_development=# \d web_hook_event_types
    ...
    Indexes:
        "web_hook_event_types_pkey" PRIMARY KEY, btree (id)
    

Quizás alguien pueda confirmar si esto parece razonable. Es posible que esto ayude a prevenir un error antes de que ocurra. Además, de ser así, la solución parece bastante directa, y estaré encantado de crear una pull request si eso es de ayuda.

Gracias.

Las restricciones de unicidad insensibles a mayúsculas y minúsculas son un poco complicadas; me siento inseguro al agregar la extensión citext para esto, y luego nos veríamos obligados a usar name_lower y duplicar la columna solo para agregar el índice.

Sí, deberíamos solucionar esto.

También está bien agregar un índice aquí.