Techioz Blog

Rails 3 で has_many :through 関係のコントローラーとビューを作成する

概要

Rails で has_many :through 関係のモデル命令を作成する方法を示すチュートリアルは数多くありますが、これらの関係を作成および編集するためのフォームを設定するプロセスに関連する記事はあまりないようです。ユーザーが Rails アプリでこの種の関係を管理できるようにするインターフェイスを作成する方法について、支援 (または良い例) を探しています。

シナリオは次のとおりです。

私のモデルは次のとおりです。

class User < ActiveRecord::Base
  has_many :relationships
  has_many :athletes, :through => :relationships
end

class Athlete < ActiveRecord :: Base
  has_many :relationships
  has_many :users, :through => :relationships
end

class Relationship < ActiveRecord :: Base
  belongs_to :users
  belongs_to :athletes
end

したがって、次のステップは、ユーザーとアスリートの関係 (コーチ、親などの役割) の作成、関係の編集、または関係の破棄を可能にするビューとコントローラーを構築することです。

最終的に、私の目標は、ユーザーがアスリートを作成し、関連する関係を選択できるシナリオを作成することです。

残念ながら、モデルの説明や has_many 関係の例以上のものを提供する具体的なチュートリアルやリファレンスは見つかりません。

この問題を簡単なレベルで解決できるリンクや例を持っている人がいれば、残りをカスタマイズできるはずです。

解決策

ここでのユーザー モデルとアスリート モデル間の関係は、本質的に、has_and_belongs_to_many 関係 (HABTM) です。あなたと行ったり来たりすることで、これらの関係を築くための最善の方法が何であるかについて混乱しているようです。

ActiveRecord の関連付けに関するドキュメント、特に HABTM 関係に関するドキュメントから読み始めるとよいでしょう。

モデルの設定は問題ありません。 HABTM 関係の設定が完了したので、次のことができます。 Athlete モデルと User モデルはどちらも非常に単純で、文字列である name 属性だけを持っていると仮定します。これで、次のようなコードを実行できるようになります (これは、rails コンソールからのコンソール出力です)。

User.create(:name => "Jeff")
usr = User.first
=> #<User id: 1, name: "Jeff">
usr.athletes
=> []
atl = usr.athletes.create(:name => "Mike")
=> #<Athlete id: 1, name: "Mike">

上の行は、Mike という名前のユーザーを作成し、この 2 つをリンクするための適切な属性を持つ関係エントリを自動的に作成します。それで、今これを呼び出すと:

usr.athletes
=> [#<Athlete id: 1, name: "Mike">]

ここで、アスリートの作成時にユーザーが自分自身とアスリートの間の関係を指定できるようにしたい場合は、文字列型の関係フィールドを持つように Relationship クラスを設定し、関係を作成するときに (上に表示したように) 、次のようなことができます。

rel = usr.relationships.where(:user_id => usr.id, :athlete_id => atl.id).first
=> #<Relationship id: 1, user_id: 1, athlete_id: 2, :relation => nil>
rel.relation = "Friend"
rel.save
=> #<Relationship id: 1, user_id: 1, athlete_id: 2, :relation => "Friend">

これが私の元の答えより役立つことを願っています。ご質問がございましたらお知らせください。そして、上で述べた ActiveRecord Associations のドキュメントを必ず参照してください。