2

多くのユーザーがいるプロジェクトモデルのM:N関係を作成しようとしています。ユーザーは多くのプロジェクトに参加できますが、プロジェクトにも多くのユーザーがいます。結合テーブルに別の列がないため、スルーは必要ないと思います。

そこで、2つのモデル(has_and_belongs_to_many:projectsとhas_and_belongs_to_many:users)に関連付けを含め、新しい移行を設定しました。

class AddProjectsUsersTable < ActiveRecord::Migration
  def self.up
    create_table :projects_users, :id => false do |t|
      t.references :project, :user
    end
  end

  def self.down
    drop_table :projects_users
  end
end

それはうまくいっています..次のことが正しいかどうかはわかりませんが、私は何かを試しました。このユーザーとプロジェクトの関係を設定できる新しいアクションをユーザーコントローラーで作成しようとしました。

  def joinProject
    @user = current_user
    @user.projects = Project.find(params[:id])

    respond_to do |format|
        format.html { redirect_to @project, notice: 'Successfully joined project.' }
        format.json { head :no_content }
    end
  end

それはおそらく間違った方法であると言っています: " undefined method 'each' for #<Project:0x00000103f10028>"

他にどのようにこの関係を設定できますか?このHABTMの関係がどのように機能しているかを私は本当に理解していなかったようです。

誰か助けてくれませんか?

興味深いまたは間違っているかもしれないいくつかのさらなる情報;)

私はこのルートを作成しました:

  match "joinProject_user/:id" => "users#joinProject", :as => :joinProject

そして、私は次のように私の見解でコントローラーアクションを呼び出しました:

 <%= link_to 'Join', joinProject_path(project) %>
4

1 に答える 1

2

コントローラアクションの2行目は次のようになります。

@user.projects += [Project.find(params[:id])]

あるいは

@user.project_ids += [params[:id]]

これにより、渡されたプロジェクトが既存のプロジェクトコレクションに追加されます。メソッド(User#projects=habtmアソシエーションによって定義される)は、Projectオブジェクトではなくコレクションを想定しています。内部的にはeach、プロジェクトが応答しないために呼び出そうとして失敗しますeach

于 2012-06-28T09:57:08.130 に答える