2013-01-07 26 views
7

Vì vậy, tôi đang sử dụng đá quý rails3_acts_as_paranoid và gặp một số vấn đề khi kiểm soát phạm vi với has_many: thông qua các liên kết.Rails actions_as_paranoid và has_many: thông qua

Ví dụ

# User.rb 
acts_as_paranoid 
has_many :folders 
has_many :files, :through => :folders 

-

# Folder.rb 
acts_as_paranoid 
belongs_to :user 
has_many :files, :dependent => :destroy 

-

# File.rb 
acts_as_paranoid 
belongs_to :files 

Bây giờ cho phép chỉ nói ở đâu đó trong users_controller.rb tôi muốn truy vấn tất cả các file thuộc về một người sử dụng, cho dù chúng bị xóa và/hoặc thuộc về các thư mục đã bị xóa. Vì vậy, tự nhiên tôi sẽ giả định để làm một cái gì đó như sau

current_user.files.with_deleted 

with_deleted phương pháp thực hiện đó là công việc tháo gỡ các files.deleted_at IS NULL

... NHƯNG ... nó không loại bỏ các default_scope cho các thư mục được sử dụng loại phía sau bức màn. Vì vậy, chúng tôi vẫn có một điều kiện folders.deleted_at IS NULL, ngăn tôi truy xuất các tệp thuộc về các thư mục mà tệp delete_at không phải là rỗng.

Tôi muốn tiếp tục sử dụng actions_as_paranoid, vì nó cực kỳ hữu ích trong tất cả các địa điểm khác của ứng dụng của tôi và đang cố gắng không làm điều gì đó như lọc thủ công và xuất hiện các phần của mảng .where_values. Nhưng tôi không biết quá nhiều về xử lý phạm vi phức tạp hoặc những phương pháp có sẵn.

+0

Có vẻ như phương pháp #unscoped là những gì bạn đang tìm kiếm tại đây: http://apidock.com/rails/ActiveRecord/Scoping/Default/ClassMethods/unscoped – pjam

+0

Tôi đã thử phương pháp chưa được quét, nhưng sẽ giảm phạm vi automagic join bridging user vào các tập tin, đặc biệt là 'INNER JOIN folders ON files.folder_id = folders.id WHERE folders.user_id = 1' trừ khi có lẽ tôi đã bỏ lỡ một tính năng không bị che khuất để giữ nó? – Misterparker

+0

Tôi vẫn đang kiểm tra xem tôi có tìm được giải pháp hay không, nhưng chỉ cần lưu ý rằng dòng '@user = User.find current_user.id' là vô ích, vì bạn đang tải lại current_user – pjam

Trả lời

9

Câu hỏi của tôi đã bị bỏ phiếu, không chắc chắn lý do. Nhưng tôi đã tìm thấy câu trả lời:

Khi trên một has_many qua, vấn đề tôi đã có là không có khả năng kiểm soát phạm vi của mô hình thông qua (thư mục trong trường hợp này).

Hóa ra bạn chỉ có thể làm được điều này

@myvar = Folder.unscoped { current_user.files.with_deleted } 

Để ai downvoted nó - Tôi muốn biết lý do tại sao, vì vậy tôi có thể đặt câu hỏi tốt hơn thời gian tới. Cảm ơn!

Các vấn đề liên quan