我的数据库中有一个属性(:book
),我想将其限制为三个不同的值>>> :classic
,:modern
,:historic
我想创建自定义验证,以便在创建或更新时,用户无法输入googly-moogly
book: classic
modern
historic
答案 0 :(得分:4)
在具有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) }
我将留下上面更冗长的例子,以防你的验证在未来变得更复杂(经常发生),并且需要一个实际的方法来解决问题。
答案 1 :(得分:0)
从@travis更新
这仅适用于单个值:
您还可以使用Active Record Validations acceptance
,它会收到一个:accept
选项,用于确定将被视为接受的值。
例如:
class library < ActiveRecord::Base
validates :book, acceptance: { accept: 'some value' }
end
*更新结束*
上的Rails指南根据@Travis的回答和@MrYoshiji的评论,您还可以将接受的值分配给常量VALID_BOOKS = [:classic, :modern, :historic]
然后设置你的回调:
validates :book, inclusion: { in: VALID_BOOKS.map(&:to_s) }