我的数据库中有一个属性(:book),我想限制为三个不同的值>>> :classic:modern:historic

我想创建一个自定义验证,以便在创建或更新该验证时,用户无法键入

book: classic
      modern
      historic

最佳答案

在任何具有book属性的模型中:

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) }


如果您的验证将来变得更加复杂(经常发生)并且需要一种实际的方法来解决该问题,我将在上面留下更详细的示例。

09-11 01:28