2015-04-23 4 views
4

У меня есть атрибут (:book) в моей базе данных, что я хотел бы ограничиться тремя различными значениями >>>:classic, :modern, :historicRails модель пользовательских проверки

Я хочу, чтобы создать пользовательскую проверку, так что когда он будет создан или обновлен, пользователь не может ввести в гугли-moogly

book: classic 
     modern 
     historic 

ответ

4

в любой модели имеет атрибут книги:

VALID_BOOKS = [:classic, :modern, :historic] 

validate :has_valid_book 

def has_valid_book 
    return if VALID_BOOKS.include? book.to_sym 
    errors.add :book, 'must be a valid book' 
end 

Редактировать

Благодаря MrYoshiji для указывая этого конкретного случая может быть упрощено

VALID_BOOKS = [:classic, :modern, :historic] 

validates :book, inclusion: { in: VALID_BOOKS.map(&:to_s) } 

Я оставлю более подробный пример выше в случае, если ваши валидация становятся все более сложными в будущем (как часто бывает), и для решения проблемы необходим фактический метод.

+2

может быть упрощена до простой 'проверяет: книгу, включение: {в: VALID_BOOKS.map (&: to_s)}' – MrYoshiji

0

Обновление от @travis

Это будет работать только для одного значения:

Вы также можете использовать Active Record Validations acceptance, которые получают в :accept параметр, который определяет значение, которое будет считаются принятием.

Например:

class library < ActiveRecord::Base 
    validates :book, acceptance: { accept: 'some value' } 
end 

* конец * обновление

Ознакомьтесь с направляющими рельсами на Validations

После ответа @Travis и комментарием @MrYoshiji, Вы могут также назначать значения, которые вы принимаете, постоянным VALID_BOOKS = [:classic, :modern, :historic]

Затем настройте свой обратный вызов как таковые:

validates :book, inclusion: { in: VALID_BOOKS.map(&:to_s) } 
+1

Просто для уточнения, в 'принятия «Дело здесь не работает. Он используется для одного возможного правильного значения (следовательно, пример TOS в документах). – Travis

+0

hmmm ... Правильно, это только для одного значения. Спасибо, что дали мне знать. – Cyzanfar

Смежные вопросы