12

Vì vậy, về cơ bản tôi có hai lớp, SáchTác giả. Sách có thể có nhiều tác giả và tác giả có thể có nhiều sách. Sách có phạm vi mặc định sau.Chỉ ghi đè phạm vi mặc định (thứ tự cụ thể) và không có gì khác trong Rails

default_scope :order => "publish_at DESC" 

Trên trang Tác giả chương trình tôi muốn liệt kê tất cả những cuốn sách liên quan đến tác giả đó vì vậy tôi nói như sau ...

@author = Author.find(params[:id]) 
@books = @author.books 

Tất cả là tốt cho đến nay. Trang tác giả # show liệt kê tất cả các sách thuộc về tác giả được sắp xếp theo ngày xuất bản.

Tôi cũng đang nghiên cứu đá quý có thể sắp xếp theo mức độ phổ biến của sách.

@books = @author.books.sort_by_popularity 

Vấn đề là bất cứ khi nào nó cố sắp xếp, default_scope luôn bị cản trở. Và nếu tôi cố gắng để unscope nó trước khi nó sẽ được thoát khỏi mối quan hệ tác giả và trả lại tất cả các cuốn sách trong cơ sở dữ liệu. Ví dụ

@books = @author.books.unscoped.sort_by_popularity # returns all books in database 

Tôi đang tự hỏi nếu tôi có thể sử dụng ActiveRelation except() method để làm một cái gì đó như thế này (mà có vẻ như nó sẽ làm việc nhưng nó không. Nó bỏ qua trật tự, chỉ cần không phải khi nó là một trật tự default_scope)

def sort_by_popularity 
    self.except(:order).do_some_joining_magic.order('popularity ASC') 
    # |------------|      |---------------------| 
end 

Bất kỳ ý tưởng nào về lý do tại sao điều này không hiệu quả? Bất kỳ ý tưởng về cách để có được điều này để làm việc một cách khác nhau? Tôi biết tôi chỉ có thể thoát khỏi default_scope nhưng tôi tự hỏi nếu có một cách khác để làm điều này.

Trả lời

28

Bạn sẽ có thể sử dụng để thay thế hoàn toàn reorder ORDER hiện THEO:

sắp xếp lại (* args)
Thay thế bất kỳ thứ tự hiện có định nghĩa về mối quan hệ với các trình tự quy định.

Vì vậy, một cái gì đó như thế này:

def self.sort_by_popularity 
    scoped.do_some_joining_magic.reorder('popularity ASC') 
end 

Và tôi nghĩ bạn muốn sử dụng một phương pháp học cho điều đó và scoped thay vì self nhưng tôi không biết toàn bộ bối cảnh như vậy có lẽ tôi sai .

Tôi không biết tại sao except không hoạt động. Các default_scope dường như được áp dụng vào cuối (loại) thay vì bắt đầu nhưng tôi đã không nhìn vào nó nhiều.

+0

Cảm ơn bạn! Điều đó thật dễ dàng. Điều này thật đúng với gì mà tôi đã tìm kiếm. – Ryan

+1

Đồng ý, đây là một phao cứu sinh. Chưa bao giờ nghe nói về sắp xếp lại cho đến bây giờ. – natebeaty

+0

Cho phép tôi thứ ba! Tôi đã thay đổi thứ tự để sắp xếp lại trong phạm vi được đặt tên của tôi và nó hoạt động như một sự quyến rũ. –