2009-07-07 24 views
39

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

たとえば、Scienceクラスの3人の学生が一緒にいるとします。実際のScienceリファレンスを削除せずにStudentsClassesテーブルからScienceオブジェクトを削除するにはどうすればよいですか?私はStudent.Classes.first.deleteが良い考えではないと推測しています。

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

答えて

57

私はにhas_manyを使用する傾向がある:通過、しかし、あなたが

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 

したい場合は、

student.classes.delete(Class.find 2) 

を使用する必要がHABTMのシンプルさがまた、モデル「クラス」を呼び出すと、本当に悪い考えです。 Rubyのコアの一部ではない名前を使用してください!

+0

まあそれは、現在設定されている方法で、私はのparamsを使用する必要があります[:CLASS_ID] Class.find_by_idが、その後使用を実行しますそれを行うクラスを見つけました。 "Student.class_ids.remove [2]"と言うだけでいいですね。 –

+0

これは、has_many:throughを必要とすると考えています。それを反映する答えを更新しました。 –

0

あなたが複数の関連する項目を削除したい場合は、*を使用して書き込むことができます。

student.classes.delete(*classes_array) 
関連する問題