У меня есть Releaseмодель с mediumи countryстолбцов (среди прочих). Не должно быть releasesобщих одинаковых medium/ countryкомбинаций.
Как мне написать это как проверку рельсов?
У меня есть Releaseмодель с mediumи countryстолбцов (среди прочих). Не должно быть releasesобщих одинаковых medium/ countryкомбинаций.
Как мне написать это как проверку рельсов?
Ответы:
Вы можете использовать проверку уникальности с 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
uniqueчто он не распознается. Для этой части я использовал ответ ниже.
uniqueness, а не unique. См. Связанную документацию. Исправляем ответ.
Во всех приведенных выше ответах не хватает того, как проверить уникальность нескольких атрибутов в модели. В приведенном ниже коде показано, как использовать несколько атрибутов в области.
validates :country, uniqueness: { scope: [:medium, :another_medium] }
Он проверяет уникальность countryво всех строках со значениями mediumиanother_medium .
Примечание. Не забудьте добавить индекс в столбец выше, это обеспечивает быстрое извлечение и добавляет проверку уровня БД для уникальных записей.
Обновление: для добавления индекса при создании таблицы
t.index [:medium, :another_medium], unique: true
Вы можете передать :scopeпараметр своему валидатору следующим образом:
validates_uniqueness_of :medium, scope: :country
Смотрите в документации еще несколько примеров.