4

has_and_belongs_to_manyモデルに新しいリレーションを作成するのに問題があります。私は次のようにモデルを定義しました:

journals model

  has_and_belongs_to_many :posts

post model

  has_and_belongs_to_many :journal

アソシエーションを作成する方法がわかりません。ボタンを作成しましたが、どのように機能するのかわかりません。アクションを作成しましたadd_post

  def add_post
    @journal_post = JournalsPosts.new
  end

このリンクを作成して関連付けを作成しましたが、今何をしなければならないのかわかりません。

<%= link_to "Add to Journal",:controller => "journals",:action => "add_post" %>

リダイレクトは正しく機能しますが、今どうすればよいかわかりませんか?HABTMアソシエーションのガイドについて知っていますか?私はすでにこれを試しましたが、役に立ちませんでした。

4

2 に答える 2

16

これを自分で調べた後、あなたはできるはずです

def add_post
    j = Journal.first # or find_by, etc
    p = Post.first # or find_by, etc
    j.posts << p # creates a record in journals_posts table
    j.save!
end

(1)受け入れられた回答は、直接関連付けを行うことしかできないかのように聞こえました。また、habtmアソシエーションを使用している場合は、「JournalsPosts」クラスはありません。これは、中間テーブルのモデルの使用を特に回避するためです。

(2)この関連付けは一意ではないことに注意してください。これを複数回呼び出すと、journals_postsテーブルに同じ2つの整数ペアを持つ複数のエントリが取得されます。

于 2014-08-26T06:00:40.660 に答える
-3

has_many, :throughRailsでこの種の関係を行うには、これが好ましい方法であるため、使用することを強く検討する必要があります。

とはいえ、続行する場合はhas_and_belongs_to_many、関連付けを正しく作成できるように、関連付けるジャーナルIDと投稿IDを何らかの方法で取得する必要があります。

あなたのルートで:

resources :journals do
  member do
    put :add_post
  end
end

あなたの見解では(あなたがどこかに設定@journalしていることを確認してください):@post

<%= link_to "Add to Journal", add_post_journal_path(@journal, :post_id => @post.id), :method => :put %>

コントローラ内:

def add_post
  @journals_posts = JournalsPosts.new(:journal_id => params[:id], :post_id => params[:post_id])

  if @journals_posts.save
    ...
  else
    ...
  end
end
于 2013-01-19T17:59:04.197 に答える