web-dev-qa-db-ja.com

アイテム自体を削除せずに、単一のHABTM関連アイテムを削除するにはどうすればよいですか?

アイテム自体を削除せずに、HABTM関連アイテムを削除するにはどうすればよいですか?

たとえば、一緒に理科の授業に参加している3人の生徒がいるとします。実際のScience参照を削除せずに、StudentClassesテーブルからScienceオブジェクトを削除するにはどうすればよいですか?私はそれを推測していますStudent.Classes.first.deleteは良い考えではありません。

チェックボックスではなく、ドラッグアンドドロップでJavaScriptを使用して追加と削除を行っています。何かご意見は?

40
humble_coder

私は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のコアの一部ではない名前を使用してください!

58
Michael Sofaer

関連する複数のアイテムを削除する場合は、*を使用して次のように記述できます。

student.classes.delete(*classes_array)
0
GEkk