У мене є 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
Дивіться документацію для додаткових прикладів.