использовать валидации Rails для ограничения одной активной в данный момент моделью - PullRequest
0 голосов
/ 17 марта 2012

Используя проверки Rails 3 и / или обратные вызовы, каков был бы самый чистый способ гарантировать, что только одна запись модели имеет логическое значение, помеченное как true? Я хотел бы отметить одну запись как текущую активную модель.

(я знаю, что другой вариант - использовать связь «один-единственный», но мне любопытно узнать, как сохранить это непосредственно в записях модели.)

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

Если все, что вы хотите сделать, это подтвердить, вы можете использовать

validates_uniqueness_of :boolean_attribute, if: :boolean_attribute

Просто добавь это в свой модельный класс. Это подтвердит, что для модели только один boolean_attribute имеет значение true.

Обратите внимание, что вам придется обойти атомарность переключения boolean_attribute из одного экземпляра в другой.

В зависимости от того, какую базу данных вы используете, вы можете решить ее с помощью транзакции. Если ваша база данных не поддерживает транзакции, вам, возможно, придется найти лучший способ гарантировать согласованность данных (например, у нас есть выделенная модель, которая указывает на «активную» модель и полностью удаляется boolean_attribute, или заменяется boolean_attribute целое число, которое может быть атомарно увеличено (наибольшее число, представляющее активное).

2 голосов
/ 17 марта 2012

Обратный вызов, вероятно, будет лучшим способом. Что-то вроде:

before_create :check_boolean

def check_boolean
   Model.find_by_boolean_value(true).nil? ? true : false
end

Если check_boolean возвращает false, действие создания отменяется (вместо find_by, который вы также можете использовать, существует?, Что, вероятно, немного более понятное кодирование)

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