Рейки: перевірити унікальність двох стовпців (разом)


130

У мене є Releaseмодель з mediumі countryстовпцями (серед інших). Не повинно бути releasesспільних ідентичних medium/ countryкомбінацій.

Як би я записав це як перевірку рейок?


Відповіді:


230

Ви можете використовувати перевірку унікальності за допомогою 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

+1 для індексу, але -1 для такої unique, яка не визнається. Для цієї частини я використав відповідь нижче.
Алекс

7
Так, вибачте, ключ перевірки повинен бути uniqueness, ні unique. Дивіться пов'язану документацію. Закріплення відповіді.
tompave

1
Гм, приємно, дякую :) Повторюся - розміщення індексу виводить рішення на наступний рівень, а не так, як інші рішення "кодування", до яких я працював, перш ніж знайти цю відповідь. +1 для цього
Алекс

70

У всіх вищезазначених відповідях відсутнє, як перевірити унікальність декількох атрибутів у моделі. Код нижче має на меті розповісти, як використовувати декілька атрибутів у межах області.

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

Він підтверджує унікальність countryу всіх рядках зі значеннями mediumта another_medium.

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

Оновлення: для додавання індексу під час створення таблиці

t.index [:medium, :another_medium], unique: true

41

Ви можете передати :scopeпараметр валідатору так:

validates_uniqueness_of :medium, scope: :country

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


8
@DennisBest Це "працює", але не захищає від перегонів. Якщо два клієнти роблять одночасні запити, вони можуть пройти перевірку, якщо жоден із них не надається до бази даних до того, як інший буде підтверджений. Вам також потрібне унікальне обмеження для бази даних, як у відповіді tompave.
суп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.