Привет,
Хотел сообщить о нескольких валидациях/ограничениях, которые существуют в моделях, но отсутствуют в базе данных.
Отсутствуют требования NOT NULL
PostDetail - ключ, значение должны быть обязательными в модели, но в БД они допускают NULL.
-
Требуется в модели (
app/models/post_detail.rb):validates_presence_of :key, :value…Но допускают NULL в БД
discourse_development=# \d post_details Таблица "public.post_details" Столбец | Тип | Сопоставление | Допускает NULL | Значение по умолчанию ------------+-----------------------------+---------------+----------------+------------------------------------------ ... key | character varying | | | value | character varying | | |Если мы добавим ограничение NOT NULL в БД, всё ещё возможно, что пустая строка пройдёт, но я считаю, что наличие NOT NULL хотя бы немного повысит безопасность.
Отсутствуют уникальные ограничения
-
TagGroup - name. Уникальность в модели (
app/models/tag_group.rb)validates_uniqueness_of :name, case_sensitive: falseНо в БД отсутствует уникальный индекс
discourse_development=# \d tag_groups ... Индексы: "tag_groups_pkey" PRIMARY KEY, btree (id) -
Аналогично, WatchedWord - word. (
app/models/watched_word.rb)validates :word, presence: true, uniqueness: true, length: { maximum: 50 }В БД есть уникальный индекс по
(action, word), но не по одному только(word):discourse_development=# \d watched_words ... Индексы: "watched_words_pkey" PRIMARY KEY, btree (id) "index_watched_words_on_action_and_word" UNIQUE, btree (action, word) -
Наконец, WebHookEventType - name. (
app/models/web_hook_event_type.rb):validates :name, presence: true, uniqueness: trueОтсутствует уникальное ограничение в БД:
discourse_development=# \d web_hook_event_types ... Индексы: "web_hook_event_types_pkey" PRIMARY KEY, btree (id)
Возможно, кто-то сможет подтвердить, выглядят ли эти предложения разумными. Возможно, они помогут предотвратить ошибку до её возникновения. Также, если это так, исправление, кажется, будет довольно простым, и я с радостью создам pull request, если это будет полезно.
Спасибо.