私は探していましたが、HABTM テーブルのレコードを削除する方法について良い答えが見つかりません。多くの人がこれと同じ要件を持っていると思います。
簡単に言うと、Students、Classs、および Classes_Students があります。
生徒がクラスをドロップしたり、その生徒がそのクラスにサインアップした HABTM レコードを削除したりできるようにしたいと考えています。
これには簡単な答えがあるはずです。誰がそれが何であるか知っていますか?
私は探していましたが、HABTM テーブルのレコードを削除する方法について良い答えが見つかりません。多くの人がこれと同じ要件を持っていると思います。
簡単に言うと、Students、Classs、および Classes_Students があります。
生徒がクラスをドロップしたり、その生徒がそのクラスにサインアップした HABTM レコードを削除したりできるようにしたいと考えています。
これには簡単な答えがあるはずです。誰がそれが何であるか知っていますか?
この状況で .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
これに答えるのが少し遅れていることは知っていますが、今夜まさにこの状況を経験したので、ここで解決策を共有したいと思いました.
フォームでこれを削除したい場合は、実際にどのように処理されるかがわかるので、次のような効果があるようにフォーム入力がネストされていることを確認してください。
クラスにコースタイトルがあるとしましょう。できるよ:
student.classes.find_by_course_title("Science").delete
どんなお困りですか?リレーションに適切な :dependent=>:destroy と :inverse_of=>[foo] がありますか?
したがって、ここでの適切な答えは、ビューで次のようなことを行うことです。
<%= link_to 'Remove', cycle_cycles_group_path(@cycle, cycle), method: :delete %><br />
cycle
上記のコードが含まれているブロックからのものです。
@cycle
結合モデル コントローラーからのインスタンス変数です。
cycle_cycles_group_path
routes.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