Rails: проверка уникальности двух столбцов (вместе)

У меня есть модель Release с столбцами medium и country (среди прочих). Не должно быть releases, которые имеют одинаковые комбинации medium/country.

Как я могу написать это как проверку рельсов?

Ответ 1

Вы можете использовать проверку uniqueness с опцией scope.

Кроме того, вы должны добавить уникальный индекс в БД, чтобы предотвратить прохождение новых записей при проверке в одно и то же время перед записью:

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end

Ответ 2

Вы можете передать параметр :scope на свой валидатор следующим образом:

validates_uniqueness_of :medium, scope: :country

Дополнительную информацию см. в документации.

Ответ 3

Все приведенные выше ответы отсутствуют, как проверить уникальность нескольких атрибутов в модели. В приведенном ниже коде рассказывается, как использовать несколько атрибутов в области.

validates :country, uniqueness: { scope: [:medium, :another_medium] }

Он проверяет уникальность country во всех строках со значениями medium и another_medium.

Примечание. Не забудьте добавить индекс в приведенный выше столбец, это обеспечивает быстрый поиск и добавляет проверку уровня БД для уникальных записей.