Vì vậy, về cơ bản tôi có hai lớp, Sách và Tá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.
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
Đồ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
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ũ. –