使用关联保存对象的Rails方法是什么?

时间:2012-12-18 20:12:29

标签: ruby-on-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 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

2 个答案:

答案 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没有为协会做这件事?这样做有危险吗?