如何验证belongs_to字段的模型字段

时间:2019-06-26 15:59:44

标签: ruby-on-rails

请考虑以下两个模型

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挂钩来检查图书协会的类型,但很好奇是否有更好的方法。

2 个答案:

答案 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