質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

625閲覧

単位を考慮したソート

takcccc

総合スコア16

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/02/27 06:16

railsのActiveRecord で、データをソートしたいと考えております。
例えば、下記のようなデータがあったとします。
"1Mbyte", "2Kbyte", "3byte"
M, K などの単位を考慮してソートしたいです。
"3byte", "2Kbyte", "1Mbyte"
と並ぶのが理想です。

配列に入れて、数値に置き換えて、ソートしておりましたが、数万件のデータがありますので、より速いやり方がないか、お知恵をお借りしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

DB上に "1Mbyte", "2Kbyte", "3byte" のように入っているのを、ActiveRecord に取得した時点でソートがかかっていて欲しい、ということでしょうか。

小数点を含まない、という前提であれば、抽出時に以下のように部分的に置き換える

置き換え前置き換え後
byte
Kbyte000
Mbyte000000

と、

置き換え前置き換え後
1Mbyte1000000
2Kbyte2000
3byte3

となるので、order() を使ってうまくソートできそうではありますが…
※ただしこれだと "3071byte" > "3Kbyte" になってしまいます。より確実にするにはきちんと演算しないとダメです

基本、RoR というより DB 側の領分ですね。

もう一つの手としては、ActiveRecord の戻り値となるオブジェクトに、 あらかじめ <=> 演算子を再定義(これが容量表現を解釈して数値化して比較する)してやって、それを使って sort_by() かけてやるとか。
※ソートの比較関数を定義してやるわけです

ActiveRecord の定義

Ruby

1class Record < ApplicationRecord 2 def <=>(other) 3 // self.~ と other.~ を使って、比較をする 4  // 最終的に self の方が前に来るなら -1 を、後に来るなら 1 を、一致するなら 0return する 5 end 6end

こんな風に ActiveRecord に <=> 演算子を定義してやります。
そうすると ActiveRecord を(配列で)全件取り出したところで、配列.sort() としてやれば、いちいち変換などせずとも(比較関数の中で変換することで)解釈してソートしてくれます。

投稿2019/02/27 08:03

編集2019/02/27 09:24
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takcccc

2019/02/27 08:21

回答ありがとうございます。 もう一つの手として、上げて頂いた内容ですが、初心者で理解できません。 具体的にご教授頂けますでしょうか?
coco_bauer

2019/02/27 08:29

1K=1000なら、"3071byte" > "3Kbyte" で正しいのでは? 3071>3000 ですから。 前提として、全てのデータが、数字 +( "M" or "K" ) + "byte" というフォーマットになっていればですが。
tacsheaven

2019/02/27 09:12

1Kbyteが 1024byte を示している場合、3071 > 3072 だからおかしなことになります。どちらの意味で使っているのか微妙でしたので。
takcccc

2019/02/27 10:10

解説ありがとうございます。 まだ、実践できておりませんが、参考にさせて頂きます。
guest

0

「速いやり方」というと、DBに入れる時点で文字列でなく数値にしておくんでしょうね。

投稿2019/02/27 07:41

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takcccc

2019/02/27 07:52

おっしゃる通りです。現在のリソースで、ソートするという命題で悩んでおります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問