1

フォームを使用せずに、親の単一の子オブジェクトをプログラムで生成するための最良の実装は何だろうと思っていました。

私の場合、コメントを介してアップロード システムに結び付けたい既存のフォーラム システムがあります。子 Forum オブジェクトを手動で作成して、アップロードが作成されるのと同じ作成アクションでそのアップロードについて話したいと思います。2 つのモデルには次のような関係があります。

子フォーラム:

class Forum < ActiveRecord::Base
   ...
   belongs_to :upload
end

親のアップロード:

class Upload < ActiveRecord::Base
   ...
   has_one :forum
end

私は次のようなことを考えていました:

class UploadsController < ApplicationController
  ...
  def create
    #Create the upload and a new forum + initial post to discuss the upload
    @upload = Upload.new(params[:upload])
    @forum = Forum.new(:upload_id => @upload.id, :title => @upload.name...)
    @first_post = Post.new(:forum_id => @forum.id....)    
    if @upload.save && @topic.save && @first_post.save
      redirect_to :action => "show", :id => @upload.id
    else
      redirect_to :action => "new"
    end 
  end

end

これは私がやりたかったことにかなり近いですが、親オブジェクトが保存されるまで親 ID は生成されません。私はおそらく次のようなことができます:

@upload.save 
@forum = Forum.new(:upload_id => @upload.id...
@forum.save....

しかし、オブジェクトがすべて検証された場合にのみオブジェクトを永続化する方がクリーンであると考えました。よくわかりませんが、他の誰かがより良い実装を知っていますか?

4

1 に答える 1

3

フォーラムの作成をコントローラーからモデルに移動することをお勧めします。フォーラムは、アップロードが正常に作成された場合にのみ作成されます。

class Upload < ActiveRecord::Base
  ...
  has_one :forum
  after_create :create_forum
  ...
  def create_forum
    Forum.create(:upload_id => self.id, :title => self.name...)
  end
end


class Forum < ActiveRecord::Base
  ...
  has_many :posts
  after_create :create_first_post
  ...
  def create_first_post
    Post.new(:forum_id => self.id)
    # or self.posts << Post.new()
  end
end
于 2012-07-06T02:40:24.257 に答える