验证HABTM模型关系的存在

时间:2012-12-19 16:34:16

标签: ruby-on-rails ruby-on-rails-3

我有以下型号

class Business < ActiveRecord::Base
    has_and_belongs_to_many :categories

    validates_presence_of :category_ids
end

class Category < ActiveRecord::Base
    has_and_belongs_to_many :businesses
end

我使用category_ids属性通过业务创建表单设置关系。

我尝试使用validates_presence_of,但是,这并未验证是否存在类别。

我可以通过浏览器操作表单,为类别提供不存在的ID。提交表单后,我收到错误:

Couldn't find Category with id=181723

编辑:

添加了以下自定义验证方法,但我仍然收到相同的错误,就好像未运行验证一样。

class Business < ActiveRecord::Base
    has_and_belongs_to_many :categories

    validate :categories_exist

    def categories_exist
      category_ids.each do |c|
        errors.add(:category_ids, :category_doesnt_exist) unless Category.exists? c
      end
    end
end

2 个答案:

答案 0 :(得分:1)

您可能有多种方法可以实现这一目标,但我建议您查看Custom ValidationsActiveRecord Callbacks

答案 1 :(得分:0)

您可以查看validates_existence宝石。这个gem对我来说非常有用,可以验证外键是否与合法的父记录相对应。如自述文件中所述:

  

这个插件库添加了ActiveRecord模型,以检查是否有   :belongs_to关联实际上在保存时存在。