Railsのコードにふりがなをつけて解説します。
今日はこの部分
#すべての単語をDBから取ってきて、文字の長さで降順に並べ thwordsに詰め込む
#ThWordモデルから"word"をgetする ソートする
# pluckについての説明はこちら
thwords= ThWord.all.pluck(:word)
.sort_by! { |word|word.length }.reverse!
pluckとは摘む、摘み取るという意味です。
必要な属性を取得するためだけに大量のレコードをロードせずに、1つ以上の属性を選択するためのショートカットとして pluckを使います。
allと比較してみます。
このようにallだとidやname,ageなどすべての要素を取得します。
Person.all
=> id=1, name= "Tanaka" age= 34
必要なものだけ取得したいときに pluckを使います。
例えば上記例だと、nameだけ取得したい場合になります。このように記載します。
Person.pluck(:name)
これだと、すべてのデータを取得しないので、メモリを大量に利用することもありません。DBへの操作は常にどのくらいのメモリを使うのか?を頭に入れておかなくてはいけないです。
下記は、Railsの公式サイトに記載されている例に説明を加えたものです。
#Personモデルからnameのプロパティだけを取り出す
Person.pluck(:name)
# SELECT people.name FROM people
# => ['David', 'Jeremy', 'Jose']
#Personモデルから idとnameを取り出す 戻値は配列になる
Person.pluck(:id, :name)
# SELECT people.id, people.name FROM people
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
#distinctは重複する要素を表示しません。distinctには、明確なという意味があります。
Person.distinct.pluck(:role)
# SELECT DISTINCT role FROM people
# => ['admin', 'member', 'guest']
#Personモデルから、年齢が21の人をMax5人まで取得してそのidを表示しなさい
Person.where(age: 21).limit(5).pluck(:id)
# SELECT people.id FROM people WHERE people.age = 21 LIMIT 5
# => [2, 3]
Rails公式サイトpluck
rubyの公式サイトにはこのように説明があります。
ブロックの評価結果を <=> メソッドで比較することで、self を昇順にソートします。ソートされた配列を新たに生成して返します。
つまり、以下とほぼ同じ動作をします。
ブロックの中は、いまこうなっています。ThWordモデルの wordプロパティをすべて取得しています。
それをsort_byによって、ブロックの条件により、順番に並びかえます。
thwords= ThWord.all.pluck(:word)
#ここ
.sort_by! { |word| word.length }.reverse!
ブロックに記載されている、並び替えの条件は、文字列の長さです。
{ |word| word.length }
そしてreverseしています。つまり文字列を長い順番に並び替えています。
thwords= ThWord.all.pluck(:word)
# reverse!で配列を逆順にする
.sort_by! { |word| word.length }.reverse!
今日はここまで。
コードにふりがなを付けることにより、初学者の理解が深まると思い記事を書いてみました。
ここまで読んでいただいてありがとうございます。