0

私は探していましたが、HABTM テーブルのレコードを削除する方法について良い答えが見つかりません。多くの人がこれと同じ要件を持っていると思います。

簡単に言うと、Students、Classs、および Classes_Students があります。

生徒がクラスをドロップしたり、その生徒がそのクラスにサインアップした HABTM レコードを削除したりできるようにしたいと考えています。

これには簡単な答えがあるはずです。誰がそれが何であるか知っていますか?

4

4 に答える 4

5

この状況で .destroy または .delete が機能しない理由は、中央のテーブルに主キーがないためです。ただし、親オブジェクトには、{other_obj}_ids という非常に優れたメソッドがあります。これは、右側のテーブル オブジェクトの左側のテーブル オブジェクトの ID のコレクションです。この情報はもちろん、中央のテーブルから取り込まれます。

それを念頭に置いて、2 つのオブジェクト クラス (Student と Classes) があります。アクティブ レコード マジックは、特別なことをしなければ通常は中間テーブルを把握できますが、has_many :through を使用することをお勧めします。

class Student < ActiveRecord::Base
    has_and_belongs_to_many :classes
end

class Classes < ActiveRecord::Base
    has_and_belongs_to_many :students
end

このセットアップで中央のテーブルに関してできることは...

student = Student.find_by(1)
student.classes # List of class objects this student currently has. 
student.class_ids # array of class object ids this student currently has

# how to remove a course from the middle table pragmatically
course = Course.find_by({:name => 'Math 101'})

# if this is actually a real course...
unless course.nil? 
   # check to see if the student actually has the course...
   if student.class_ids.include?(course.id)
       # update the list of ids in the array. This triggers a database update
       student.class_ids = student.class_ids - [course.id]
   end
end

これに答えるのが少し遅れていることは知っていますが、今夜まさにこの状況を経験したので、ここで解決策を共有したいと思いました.

フォームでこれを削除したい場合は、実際にどのように処理されるかがわかるので、次のような効果があるようにフォーム入力がネストされていることを確認してください。

于 2014-03-23T00:18:14.783 に答える
0

クラスにコースタイトルがあるとしましょう。できるよ:

student.classes.find_by_course_title("Science").delete
于 2013-04-23T15:59:14.580 に答える
0

どんなお困りですか?リレーションに適切な :dependent=>:destroy と :inverse_of=>[foo] がありますか?

于 2013-04-23T15:06:38.803 に答える
0

したがって、ここでの適切な答えは、ビューで次のようなことを行うことです。

<%= link_to 'Remove', cycle_cycles_group_path(@cycle, cycle), method: :delete %><br />

cycle上記のコードが含まれているブロックからのものです。

@cycle結合モデル コントローラーからのインスタンス変数です。

cycle_cycles_group_pathroutes.rbファイル内のモデル「Cycle」の下のネストされた結合テーブル「cycles_groups」です。

resources :cycles do 
  resources :cycles_groups do
  end
end

結合モデル コントローラーは次のようになります。

def destroy
    @cycles_group = CyclesGroup.find(params[:id])
    @cycle = @cycles_group.cycle
    @cycles_group.destroy

    puts "cycle: #{@cycle}"

    respond_to do |format|
        format.html {redirect_to cycle_path(@cycle), notice: 'Training Week was successfully removed!'}
    end
end 
于 2013-07-23T03:12:38.143 に答える