アイテム自体を削除せずに、HABTM関連アイテムを削除するにはどうすればよいですか?
たとえば、一緒に理科の授業に参加している3人の生徒がいるとします。実際のScience参照を削除せずに、StudentClassesテーブルからScienceオブジェクトを削除するにはどうすればよいですか?私はそれを推測していますStudent.Classes.first.delete
は良い考えではありません。
チェックボックスではなく、ドラッグアンドドロップでJavaScriptを使用して追加と削除を行っています。何かご意見は?
私はhas_many:throughを使用する傾向がありますが、試したことはありますか
student.classes.delete(science)
IDだけでなく、ターゲットオブジェクトが必要になることは、HABTMの制限だと思います(結合テーブルは便宜上抽象化されているため)。 has_many:throughを使用すると、(モデルを取得するため)結合テーブルを直接操作でき、この種のことをより少ないクエリに最適化できます。
def leave_class(class_id)
ClassMembership.delete(:all, :conditions => ["student_id = ? and class_id = ?", self.id, class_id)
end
HABTMのシンプルさが必要な場合は、使用する必要があります
student.classes.delete(Class.find 2)
また、モデルを「クラス」と呼ぶのは本当に悪い考えです。 Rubyのコアの一部ではない名前を使用してください!
関連する複数のアイテムを削除する場合は、*
を使用して次のように記述できます。
student.classes.delete(*classes_array)