所以基本上我有两个课程,Book和Author。书籍可以有多个作者,作者可以有多个书籍。书籍具有以下默认范围。
default_scope :order => "publish_at DESC"
在作者显示页面上,我想列出与该作者相关的所有书籍,所以我说以下...
@author = Author.find(params[:id])
@books = @author.books
到目前为止一切都很好。author#show 页面列出了属于该作者的所有书籍,按出版日期排序。
我还在研究一种能够按一本书的受欢迎程度排序的宝石。
@books = @author.books.sort_by_popularity
问题是每当它尝试排序时,default_scope 总是会妨碍它。如果我在它摆脱作者关系并返回数据库中的每一本书之前尝试取消它的范围。例如
@books = @author.books.unscoped.sort_by_popularity # returns all books in database
我想知道我是否可以使用ActiveRelation except() 方法 来做这样的事情(看起来它应该可以工作但它没有。它忽略了顺序,而不是当它是 default_scope 顺序时)
def sort_by_popularity
self.except(:order).do_some_joining_magic.order('popularity ASC')
# |------------| |---------------------|
end
关于为什么这不起作用的任何想法?关于如何让它以不同的方式工作的任何想法?我知道我可以摆脱 default_scope 但我想知道是否还有其他方法可以做到这一点。