3

さて、これがシナリオの例です。学生用リソースがあり、resources :students学生は多くのコレクションを持っており、それらに属しています:resources :clubsresources :majorsなど。

したがって、ルートを簡単に設定できます...

resources :clubs do
  resources :students
end
resources :majors do
  resources :students
end
resources :students do
  resources :clubs
  resources :majors
end

これにより、一連の標準的なRESTfulルートが生成されます

  • / clubs
  • / clubs /:id
  • / clubs /:club_id / students
  • / clubs /:club_id / student /:id
  • /専攻
  • / majors /:id
  • / majors /:major_id / student
  • / majors /:major_id / student /:id
  • /学生
  • / student /:id
  • / student /:student_id / clubs
  • / student /:student_id / clubs /:id
  • / student /:student_id / majors
  • / student /:student_id / majors /:id

これが私の質問です。RESTセマンティクスでは、学生の専攻をどのように削除しますか?専攻の下で学生を閲覧する/majors/:major_id/students/:idと、特定の専攻の「コレクション」にその学生が表示されます。ただし、:idを削除するためのルートは、を指しStudentsController#destroyます。これにより、学生は完全に削除されます。おっと!ですから、逆に行って、リソースに対してDELETEを実行すると、/students/:student_id/majors/:idUnderwaterBasketweavingはこの学校では提供されなくなります...おっと!

これで、ClubsController、MajorsController、StudentsControllerのdestroyメソッドを設定して、club_id、major_id、student_idを検索できますが、将来的には、FraternitiesやGraduatingClassesなどを追加したいとします。各クラスは次のようになります。どのパラメータが存在するかを確認するための巨大なスイッチ条件で構成されています...次に、最上位のリソースのコレクションを見つけて最下位のリソースを削除するか、またはその逆を行います。モデル自体は、関連付けレコードがなくなった場合に自分自身を削除するかどうかを決定する必要があります...そのリソースの「破棄」は実際には誤った名称になっています...

これを行う簡単な方法はありますか?人気のあるRESTfulRailsプラグインでさえ、Joe's Majorsから削除するときにUnderwaterBasketweavingを吹き飛ばしたり、主要なUnderwaterBasketweavingから削除するときにJohnDoeを完全に削除したりしますmake_resourcefulresource_controllerセマンティクスの望ましい効果と「破棄」が何をすべきかを理解するために、関連付けを調べる可能性があるように思われます。

それではまた、私はこれをすべて間違って見ていますか?単一のリソースとしてのUnderwaterBasketweaving->JoeではなくUnderwaterBasketweaving+Joeであり、削除するのは本当にJoeでもUnderwaterBasketweavingでもありませんが、組み合わせを表すリソースですか?ただし、コントローラーが学生と専攻である場合、それは事実上同じ名前のリソースを表すので簡単ではありません(MVCは実際にはRVになりました...「従来の」アプローチでは、モデル名に関係のないコントローラーを開発していません、またはそれに到達するためのパス)したがって、専攻または学生を削除することになります。あなたの毒を選んでください...

削除がコレクションのコンテキストにあり、その特異性に関係しないことが望まれる場合、削除が実際には意図されていない、関連するリソースの無限のグラフ全体で条件を管理することを回避するにはどうすればよいですか?

... major.student.delete...'学生'ActiveRecordオブジェクトが'メジャー'ARオブジェクトで始まるメソッドチェーンで'削除'メッセージが送信されたことを知る方法はありますか?

4

1 に答える 1

2

標準的なRESTfulアプローチはhas_many :through、アソシエーションリソースのコントローラーを使用して生成することです。アソシエーションリソースに名前を付けることは常に困難ですが、この例を試してみます。

resources :majors do
  resources :studies
  resources :students
end
resources :students do
  resources :studies
  resources :majors
end

もちろん、モデルは次のようになります。

class Major < ActiverRecord::Base
  has_many :studies
  has_many :students, :through => :studies
end

など(詳しく説明してほしい場合はコメントしてください)

次に、学生の場合、関連付けられているのは削除せず@student.major、彼のを削除し@student.studies.where :major => @majorます。

于 2010-11-07T15:08:37.650 に答える