什么是Rails保存关联对象的方式?

问题描述:

我有几个班级,通常一个一对多的关系,如:什么是Rails保存关联对象的方式?

class Blog < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :blog 
    validates :blog_id, presence: true 
end 

当我建立一个博客,并给它添加了一堆帖子:

blog = Blog.new 
blog.posts = [Post.new, Post.new] 

我不能只需保存博客,如下所示:

blog.save 

因为帖子中的blog_id为空,所以帖子验证失败。我以为Rails是智能足以检查id或存在的对象,但它不是。

解决这个问题的正确方法是什么?更好的东西比:

saved = true 
Blog.transaction do 
    saved &&= @blog.save 
    if saved && params[:blog][:posts].responds_to?(:each) 
    params[:blog][:posts].each do |post| 
     p = Post.new({blog: @blog}, without_protection: true) 
     saved &&= p.save 
    end 
    end 
end 

你可以这样做两种方式

blog.posts.create(attributes_of_new_post) 

blog.posts << Post.new(attributes_of_new_post) 

,改变你的has_many是

has_many :posts, :inverse_of => :blog 
+0

有趣。 'blog.posts

+0

是的。或者在那个时候博客已经在数据库中了。或者当你点击blog.save时。哦,那些聪明的铁轨开发者!我也感到惊讶。 – digidigo

+0

这两个人有同样的问题。 – Pablo

我的解决方案,到目前为止,是要更改验证行:

validates :blog_id, presence: true 

validate { errors.add(:blog, "can't be blank") if blog_id.blank? && blog.blank? } 

这使我想,为什么不这样做的Rails,对于联想?这样做有没有危险?