1

我有几个具有通常一对多关系的类,例如:

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 或存在,但事实并非如此。

解决这个问题的正确 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
4

2 回答 2

0

你可以通过两种方式做到这一点

blog.posts.create(attributes_of_new_post)

或者

blog.posts << Post.new(attributes_of_new_post)

并将您的 has_many 更改为

has_many :posts, :inverse_of => :blog
于 2012-12-18T20:15:06.460 回答
0

到目前为止,我的解决方案是将验证行从:

validates :blog_id, presence: true

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

这让我想知道,为什么 Rails 不为关联做这件事?这样做有什么危险吗?

于 2012-12-19T10:09:39.610 回答