validates_associated以验证两个模型之间的关联

时间:2014-05-02 09:21:32

标签: ruby-on-rails ruby ruby-on-rails-4

我有两个模型Post模型和Comment模型..首先如果创建一个帖子它的帖子ID为1然后在创建评论时我可以使用post_id等于1给帖子关联但是如果我创建一个帖子ID为2的评论不存在它仍会继续创建评论,但ID为' nil' ..我想确保评论将被创建只有相应的post_id存在。

class Post < ActiveRecord::Base
 has_many :comments, dependent: destroy
end

class Comment < ActiveRecord::Base
  belongs_to :post
  validates_associated: post
end

根据我的理解,validates_associated会在创建评论之前检查帖子模型中的验证是否通过。如果我错了,请澄清我,对于上述情况,什么是合适的解决方案?

2 个答案:

答案 0 :(得分:1)

首先,在这里设置关联的首选方式是发表评论:

def new
  @product = Product.first
  @comment = @product.comments.build
end

def create
  @product = Product.find(params[:comment][:post_id])
  @comment = @product.comments.create(comment_params)
end

对于您的特定情况,我假设post_id通过某种形式或类似物进入参数,然后您希望仅在具有该特定post_id的帖子时创建评​​论存在。这可以通过在Comment模型中添加以下内容来完成:

validates :post, presence: true, allow_blank: false

OR

validate :post_presence, on: :create
def post_presence
  errors.add(:post_id, "Post doesn't exist") unless Post.find(post_id).present?
end

你甚至可以在控制器端使用before_action/before_filter挂钩做同样的事情。

答案 1 :(得分:0)

您可以执行此操作来验证post_id

的存在
class Comment < ActiveRecord::Base
  belongs_to :post
  validates :post_id, :presence => true
end

或要验证关联,您可以使用

class Comment < ActiveRecord::Base
  belongs_to :post
  validates_presence_of :post
end