2009-07-07 16 views
39

Làm cách nào để xóa mục được liên kết với HABTM mà không xóa mục đó?Làm cách nào để xóa một mục được liên kết với HABTM mà không xóa chính mục đó?

Ví dụ: giả sử tôi có 3 Học sinh cùng lớp Khoa học. Làm cách nào để xóa các đối tượng Khoa học khỏi bảng StudentsClasses mà không xóa tham chiếu Khoa học thực tế? Tôi đoán rằng Student.Classes.first.delete không phải là một ý tưởng hay.

Tôi đang sử dụng JavaScript với tính năng kéo và thả để thêm và xóa, chứ không phải hộp kiểm. Có suy nghĩ gì không?

Trả lời

57

tôi có xu hướng sử dụng has_many: thông qua, nhưng có bạn đã cố gắng

student.classes.delete(science) 

Tôi nghĩ rằng cần phải có đối tượng mục tiêu, không chỉ là ID, là một hạn chế của HABTM (từ bảng tham gia là trừu tượng đi để thuận tiện cho bạn). Nếu bạn sử dụng has_many: thông qua bạn có thể hoạt động trực tiếp trên bảng kết nối (vì bạn nhận được một Mô hình) và cho phép bạn tối ưu hóa loại điều này thành ít truy vấn hơn.

def leave_class(class_id) 
    ClassMembership.delete(:all, :conditions => ["student_id = ? and class_id = ?", self.id, class_id) 
end 

Nếu bạn muốn sự đơn giản của HABTM bạn cần phải sử dụng

student.classes.delete(Class.find 2) 

Ngoài ra, gọi một mô hình "Class" là một ý tưởng thực sự xấu. Sử dụng tên không phải là một phần cốt lõi của Ruby!

+0

Vâng cách thức mà nó hiện đang thiết lập, tôi phải sử dụng params [: class_id] để thực hiện Class.find_by_id sau đó sử dụng tìm thấy lớp học để làm điều đó. Sẽ rất tuyệt nếu tôi chỉ có thể nói "Student.class_ids.remove [2]". –

+0

Đó là loại suy nghĩ bạn cần has_many: thông qua cho. Đã cập nhật câu trả lời để phản ánh điều đó. –

0

Nếu bạn muốn xóa nhiều mục liên quan bạn có thể sử dụng * và viết:

student.classes.delete(*classes_array) 
Các vấn đề liên quan