12

基本的に私は2つのクラスを持っています予約著者です。書籍は複数の著者を持つことができ、著者は複数の書籍を持つことができます。書籍には次の​​デフォルトスコープがあります。私はその著者に関連付けられているすべての書籍を一覧表示したい著者ショーのページでデフォルトのスコープ(特に順序)をオーバーライドし、その他のものは無効にします

default_scope :order => "publish_at DESC" 

ので、私は、次の...

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

すべてがこれまでのところ良いですと言います。 author#showページには、その著者に属するすべての書籍が出版日順に並べられて表示されます。

私はまた、本の人気によって分類することができる宝石に取り組んでいます。

問題は、ソートしようとするたびにdefault_scopeが常に途切れることです。そして私がそれを賢明にしようとすると、それが著者の関係を取り除き、データベースのすべての本を返すでしょう。私はそれが動作するはずのように思えるが、それはしません。このような何かを(行うためにActiveRelation except() method を使用することができる場合の例

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

のために私は思ったんだけど。それはそれはdefault_scope順序であるだけではないとき、順番を無視します)

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

これはなぜ機能しないのでしょうか?どのようにこれを別の方法で動作させるための任意のアイデアですか?私はちょうどdefault_scopeを取り除くことができる知っているが、私はこれを行う別の方法があるのだろうかと思っています。あなたは完全にすることで、既存のORDERを置き換えるためにreorderを使用することができるはずです

答えて

28

リオーダー(*引数)
は、指定された順序との関係で定義されたすべての既存の秩序を置き換えます。だから、

このような何か:

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

そして、私はあなたの代わりにselfのそれとscopedのクラスメソッドを使用したいが、私はので、多分私が間違っている全体の状況を知らないと思います。

なぜexceptが動作しないのですか。 default_scopeは最初よりむしろ最後に適用されるようですが、それほど多くは見ていません。

+0

ありがとうございました!それはとても簡単でした。これはまさに私が探していたものです。同意した、これは命を救う人だった。 – Ryan

+1

これまでのところ、再注文は聞いたことがありません。 – natebeaty

+0

私に3番目を許可してください!私は私の名前付きスコープで注文を変更し、それは魅力的に機能しました。 –

関連する問題