请考虑以下两个模型
class Book < ActiveRecord::Base
has_many :book_reports
enum genre: [:fiction, :nonfiction]
end
class BookReport < ActiveRecord::Base
belongs_to :book
end
我想验证book_reports,以便只保存类型为:fiction的书。我可以添加一个before_save挂钩来检查图书协会的类型,但很好奇是否有更好的方法。
答案 0 :(得分:1)
您可以改用before_create
回调,这样您就可以在工作流程中更快地了解该类型,但是在其他方面您的想法很合理:
使用回叫来触发对该类型的检查,如果与您要查找的内容不匹配,请拒绝该记录并继续。
您还可以使用:validates
回调来验证self.genre == 'Fiction'
或您要检查的其他内容,并使用before_validation
更快地进行捕获。
我建议您仔细阅读Active Record Callbacks上的RubyGuides页面,以进一步了解工作流程,然后根据最佳判断来决定何时实际检查所需的Genre值。
答案 1 :(得分:1)
您可以使用custom methods:
validate :belongs_to_fiction_book, on: [:create, :update]
def belongs_to_fiction_book
errors.add(:book, "is not a fiction book.") unless book.genre == "fiction"
end