Rails:验证关联的存在

时间:2009-08-26 03:33:00

标签: ruby-on-rails

我有一个分类和一个帖子模型,每个帖子属于一个类别。在创建或更新帖子之前,我需要检查所选的类别是否存在。验证此信息的最佳方法是什么?

目前,我正在控制器中进行查找,以确保该类别存在。是否可以在模型中加入这些验证?

6 个答案:

答案 0 :(得分:20)

在Rails 3.2中,validates_existence_of被validates_presence_of替换。

答案 1 :(得分:16)

http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

class Post < ActiveRecord::Base
  belongs_to :category
  validates_presence_of :category 
end

-OR -

class Post < ActiveRecord::Base
  belongs_to :category
  validates :category, presence: => true
end

3.2之前的Rails版本:

class Post < ActiveRecord::Base
  belongs_to :category
  validates_existence_of :category 
end

答案 2 :(得分:5)

我把它放在我的模型中:

  validate :ensure_category_exists

  def ensure_category_exists
    errors.add('Category') unless self.blog.categories.find_by_id(self.category_id)
  end

如果父博客不存在类别,则打印“类别无效”。

答案 3 :(得分:1)

以我的思维方式,这个宝石有更好的选择:https://github.com/perfectline/validates_existence

验证相关模型在数据库中的存在。想象一下,即使您没有选择任何内容(默认未选择第一个字段标签作为值),您也有一个下拉字段可以返回一些垃圾数据。验证状态将不起作用,因为它将传递现有数据。但我们想要某种约束,这种数据库边检查可以解决问题。

答案 4 :(得分:0)

我的经历绝对值得一提。这适用于Rails 4(也可能是其他版本)。

给出实体模型的has_many或has_one。

即使提交中提供了ID,也可以确保输入的关联(关联ID)存在的验证。

validates_presence_of :model

这不是验证,它可以确保输入中输入了某些内容(不是空白)。

validates_presence_of :model_id

您也许可以只使用前者,但我俩都必须有更具体的错误消息。

答案 5 :(得分:-2)

在Rails 3中,validates_associated可能是您正在寻找的? http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated