Mancano vincoli NOT NULL e di unicità nel DB

Ciao,

Volevo segnalare alcune convalidie vincoli presenti nei modelli ma mancanti nel database.

Vincoli NOT NULL mancanti

PostDetail - key, value sono obbligatori nel modello ma sono nullable nel database.

  1. Obbligatori nel modello (app/models/post_detail.rb):

    validates_presence_of   :key, :value
    

    …Ma nullable nel database

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

    Se aggiungiamo un vincolo NOT NULL al database, è comunque possibile che venga accettata una stringa vuota, ma credo che avere NOT NULL renda almeno un po’ più sicuro il sistema.

Vincoli di unicità mancanti

  1. TagGroup - name. Unico nel modello (app/models/tag_group.rb)

    validates_uniqueness_of :name, case_sensitive: false
    

    Ma manca un indice unico nel database

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

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

    Il database ha un indice unico su (action, word) ma non su (word) da 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. Infine, WebHookEventType - name. (app/models/web_hook_event_type.rb):

    validates :name, presence: true, uniqueness: true
    

    Manca un vincolo di unicità nel database:

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

Forse qualcuno potrebbe confermare se queste osservazioni sembrano ragionevoli. Potrebbero aiutare a prevenire un bug prima che si verifichi. Inoltre, se è così, la correzione sembra abbastanza diretta, e sono felice di creare una pull request se può essere utile.

Grazie.

I vincoli di unicità insensibili al case sono un po’ insidiosi; sono riluttante ad aggiungere l’estensione citext per questo motivo, e saremmo quindi costretti a creare name_lower e duplicare la colonna solo per aggiungere l’indice.

Sì, dovremmo risolvere questo problema.

Anche qui va bene aggiungere un indice.