我有一些通常的一对多关系,比如:
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 smart 足以检查id或对象的存在,但事实并非如此。
解决这个问题的Rails方法是什么?比什么更好:
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
答案 0 :(得分:0)
你可以通过两种方式做到这一点
blog.posts.create(attributes_of_new_post)
或
blog.posts << Post.new(attributes_of_new_post)
并将你的has_many改为
has_many :posts, :inverse_of => :blog
答案 1 :(得分:0)
到目前为止,我的解决方案是更改验证行:
validates :blog_id, presence: true
到
validate { errors.add(:blog, "can't be blank") if blog_id.blank? && blog.blank? }
这让我想知道,为什么Rails没有为协会做这件事?这样做有危险吗?