ActiveRecord has_many关系防止孤立新创建的对象

时间:2010-10-17 06:26:10

标签: ruby-on-rails activerecord associations belongs-to

假设我有一个属于Post模型的Comment模型。

我想这样做,以便创建一个新的Comment实例(无论是new,create,find_or_create_by_x等)都会失败(最好引发异常),除非立即设置Post(通过将其作为参数或在创建评论时始终引用帖子,例如post.comments.new或post.comments.create)。

我想这样做,因为我想在评论对象中设置一些基于帖子的默认值...所以帖子引用需要立即有效。

实现这一目标的最佳方法是什么?感谢。

2 个答案:

答案 0 :(得分:0)

我认为为了使其与new一起使用,您必须在after_initialize中执行此操作:

def after_initialize
  raise "no Post" unless post
end

虽然看起来像矫枉过正,因为每次评论实例化时都必须运行。我会说写测试可以确保正确设置默认值。

答案 1 :(得分:0)

我会在你的评论模型中添加验证,如下所示:

class Comment < ActiveRecord::Base
  validates_presence_of :post_id
end

然后使用以下方法创建新评论:

@post = Post.find(params[:post_id])

@post.comments.create(params[:comment])