背景
Rails3系からRails5系に資源のバージョンアップをする機会があり、メソッドの仕様について分からないことがあったのでご教示いただきたいです。
わからないこと
will_paginationを導入した環境でのsortメソッドについて
Rails3では
@resources = BookLibrary.paginate(:page => params[:page]) @resources.sort!{|a, b| a.code.to_i <=> b.code.to_i}
のようにしてModelから取得したインスタンスに対してsort!メソッドを使用してソートが動いていたのですが
Rails5に移行するとエラーになります。
一応下記のように破壊的をやめることで、先に進めるのですが
@resources = BookLibrary.paginate(:page => params[:page]) @resources = @resources.sort{|a, b| a.code.to_i <=> b.code.to_i}
これだとwill_paginationの方で
undefind method 'total_pages' for Array<xxxxxxxxx>
のようにエラーになります。
will_paginationのtotal_pagesメソッド内部ではwillpagination::collectionクラスに含まれる(@resources.)total_entriesの値を期待しているので、Arrayクラスで渡してしまうとエラーになってしまうという理解なのですが、なぜRails3ではsortメソッドを通ってもArrayにならないかがわかりません。sortメソッドの返り値はArrayクラスですよね?
※Rails3の環境でログに出すとsortメソッドを通った後もwillpagination::collectionを保っていました。
仕様変更であるとは思うのですが、ドキュメントを見つけられず実装に自信が持てません。
教えてほしいこと
- なぜRails5ではsort!(破壊的メソッド)が使えなくなっているのか※Rails3では使えている。
- Rails3ではsortメソッドを通ってもArrayクラスで返却されないのは何故か。(破壊的メソッドはインスタンスのクラスを変えないとかあるのでしょうか?)
- will_paginationは配列で渡しても動くという記事を見かけましたが、Arrayを渡すとどうしてもtotal_pagesでエラーになります。これに対して改善のアプローチはあるでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/29 10:36
2019/11/29 11:58
2019/12/02 01:32