Это правильный способ обеспечения уникальности в Rails без уникального индекса? - PullRequest
0 голосов
/ 31 октября 2019

Является ли это допустимым способом обеспечения уникальности в Rails без уникального индекса?

class User < ActiveRecord::Base
  def self.create params
    User.transaction do
      return false if find_by(email: params[:email])

      super
    end
  end
end

1 Ответ

0 голосов
/ 31 октября 2019

Вы можете использовать проверку уникальности ActiveRecord. Проверки используются, чтобы гарантировать, что в вашу базу данных сохраняются только действительные данные. Проверки на уровне модели - лучший способ убедиться, что в вашу базу данных сохраняются только действительные данные. Они не зависят от базы данных, не могут быть обойдены конечными пользователями и удобны для тестирования и обслуживания. Rails делает их простыми в использовании, предоставляет встроенные помощники для общих нужд и позволяет создавать собственные методы проверки.

Уникальность

class Account < ApplicationRecord
 validates :email, uniqueness: true
end

Это не создает ограничение уникальности в базе данных, поэтому может случиться, что два разных подключения к базе данных создадут две записи с одинаковым значением для столбца, который вы намереваетесь быть уникальным. Чтобы избежать этого, вы должны создать уникальный индекс для этого столбца в вашей базе данных.

Когда использовать ограничения базы данных? Ограничения базы данных и / или хранимые процедуры делают механизмы проверки зависимыми от базы данных иможет сделать тестирование и обслуживание более сложным. Однако, если ваша база данных используется другими приложениями, возможно, будет полезно использовать некоторые ограничения на уровне базы данных. Кроме того, проверки на уровне базы данных могут безопасно обрабатывать некоторые вещи (например, уникальность в часто используемых таблицах), которые могут быть трудны для реализации в противном случае.

Подробнее о проверках ActiveRecord

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...