什么是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
答
我的解决方案,到目前为止,是要更改验证行:
validates :blog_id, presence: true
到
validate { errors.add(:blog, "can't be blank") if blog_id.blank? && blog.blank? }
这使我想,为什么不这样做的Rails,对于联想?这样做有没有危险?
有趣。 'blog.posts
是的。或者在那个时候博客已经在数据库中了。或者当你点击blog.save时。哦,那些聪明的铁轨开发者!我也感到惊讶。 – digidigo
这两个人有同样的问题。 – Pablo