zakihayaメモ

RubyとRailsのことが中心

has_manyな関連にbuildした後にsortを実行したい

[Rails] has_many through な関連をチェックボックスで操作するときに苦労した話 | ハレノヒブログ

こちらのページを参考に、WordPressのカテゴリー選択UIみたいのを作りました。
が、これだと選択されたカテゴリが上に来てしまってソート順が無効になってしまうので、何とかする方法。

普通にsort!使えばいいじゃない

ということで下のようにやってみる。

article.categorizations.sort! { |a, b| a.category_id <=> b.category_id }

すると、sort!なんて無いといわれる。なぜだ。。。

has_manyなアソシエーションで取得できるcollectionはArrayではない

クラス名::ActiveRecord_Associations_CollectionProxyというクラスらしい。
そしてこのクラスはsort!を持っていない。

よく見たら、article.categorizations.targetにも同じデータが入っているように見える。
そしてこいつのクラスはArray。

なので、こうしたらうまくいった。

article.categorizations.target.sort! { |a, b| a.category_id <=> b.category_id }

targetをいじっていいのか迷ったが、公開されてるプロパティなので大丈夫なんだろう。。。