1

次のような通常の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

あなたはそれを2つの方法で行うことができます

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 に答える