Переопределить только область действия по умолчанию (особенно порядок) и ничего больше в Rails

Итак, в основном у меня есть два класса: 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 exclude() сделать что-то вроде этого (кажется, что это должно работать, но это не так. Он игнорирует порядок, но не тогда, когда это порядок default_scope)

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

Есть идеи, почему это не работает? Любые идеи о том, как заставить это работать по-другому? Я знаю, что могу просто избавиться от default_scope, но мне интересно, есть ли другой способ сделать это.

12
задан mu is too short 1 December 2013 в 22:11
поделиться