10

与えられた

ユーザー:

class User < ActiveRecord::Base
   has_many :discussions
   has_many :posts
end

ディスカッション:

class Discussion < ActiveRecord::Base
    belongs_to :user
    has_many :posts
end

投稿:

class Post < ActiveRecord::Base
    belongs_to :user
    belongs_to :discussion 
end

現在、コントローラーで投稿を初期化しています

@post = current_user.posts.build(params[:post])

私の質問は、投稿とディスカッションの関係も設定されるように @post モデルを設定/保存/編集するにはどうすればよいですか?

4

1 に答える 1

13

投稿とともにディスカッションを保存および編集する

既存のディスカッション

作成中の投稿を既存のディスカッションに関連付けるには、id を投稿パラメーターにマージするだけです

@post = current_user.posts.build(
          params[:post].merge(
            :discussion_id => existing_discussion.id
        ) 

@post関連付けが保存されるように、フォームにディスカッション ID の非表示の入力が必要です。


新しいディスカッション

すべての投稿とともに新しいディスカッションを作成し、フォームを介してその属性を管理する場合は、accepts_nested_attributes

class Post < ActiveRecord::Base
  belongs_to :user
  belongs_to :discussion
  accepts_nested_attributes_for :discussion
end

build_discussion投稿を作成した後、コントローラーでディスカッションを作成する必要があります

@post.build_discussion

また、フォームには、ディスカッション用のネストされたフィールドを含めることができます

form_for @post do |f|
  f.fields_for :discussion do |df|
    ...etc


これにより、投稿とともにディスカッションが作成されます。ネストされた属性の詳細については、この優れた Railscast をご覧ください


より良い関係

さらに、関連付け:throughのオプションを使用して、より一貫性のあるリレーショナル設定を行うことができます。has_many

class User < ActiveRecord::Base
  has_many :posts
  has_many :discussions, :through => :posts, :source => :discussion
end

class Discussion < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
  belongs_to :discussion 
end

Postこのように、ディスカッションに対するユーザーの関係は、2 つの場所ではなく、モデル内でのみ維持されます。

于 2012-07-18T12:36:44.423 に答える