モデルの中の要素をランダムに表示したい(1)
カリキュラムの復習を一旦終了し、オリジナルアプリの実装(1から自分の考えた構想通りのものを作れるか)をやってみることに。
まずは、
タグの検索機能でしたように、自分が指定した条件で問題が表示できる機能を実装したい。
これだけなら、新しい知識は必要なさそうだが、
問題なので、順番に答えを覚えてしまうのが怖い。条件が厳しく、問題数が少ないとあればなおさら答えを覚えてしまい勉強になっているようでなっていないという事態になりやすい。
そこで、検索ごとにランダムに並び変わるシステムが欲しい。
また、これは後回しになるが
ランダム出力かそうでないかを選択できる。
一覧を印刷できる。
一覧をそのままWebで解答できる。
⇨Javaを使って次のページに移行しなくても◯か❌か表示したい。
⇨いちいち検索しなくてもその場で並び替えられるシステムを組みたい。
一覧をエクセルファイルで出力できる。
まだしたいことはあるが、とりあえずここまでできるものを作ろうと思う。
話を戻して、
まずは、モデルに登録された問題をランダムに表示するようにする機能を作りたい。
知識はないので、どのように設定すればできるかを考える。
・問題を登録するカラムに「ランダムな値」を登録する。
→カラムがランダムなら知っている知識、orderメソッドでランダムに並び変わるはず。
→毎回変わるような乱数をそもそもモデルに登録できるのか?
→ランダムな値を登録できたとして、そのランダムな値に固定されてしまい、毎回並び順が変わるということはないのではないか。
・とりあえず検索してみる
「Ruby カラム ランダム」で検索。
rand()で乱数が作られるのはカリキュラムでも読んだ。
しかし、これでは懸念通り最初だけランダムな値が出力されてしまう。
バラバラに出力はされるが、別のパターンのバラバラにはならない。
次に「Ruby ランダムに並びかえる」で検索
https://docs.ruby-lang.org/ja/latest/method/Array/i/shuffle.html
shuffleメソッドというのがあるみたい。
とりあえず、
https://paiza.io/projects/hWaljlLyIJ5bfD4K63YkvA
を使ってちょっとどうなるのかやってみる。
a = [ 1,2,3]
puts a.shuffle
とすると、確かに並び変わっているみたい。
次に
a = [ first: 1 , second: 2 ,third: 3]
puts a.shuffle
としてみたら、並び変わっていないみたい。
そこでもう1つ書いてあるほうを使ってみる
a = [ 1, 2, 3 ]
rng = Random.new
a.shuffle(random: rng)
puts a
並び変わっていない。
shuffleメソッドについて検索してみる
https://qiita.com/maru53/items/39158b599c3a0ae59103
https://www.sejuku.net/blog/72965
shuffleでできそうなんだけど・・・
カリキュラムで検索を教えるものがあったので
新規作成し直し、そのファイルでshuffleメソッドを使用してみることに
こんな感じでやったらしっかりランダム出力ができている。
ページ更新するたびに検索結果が変わっているのでできていると思う。
これでランダム出力はできそう。
次は出力時にランダムで表示するか、id順にするかを選択できるようにする。
if文で先程のshuffleメソッドがかかる記述とそうでない記述をそれぞれ部分テンプレートで呼べるようにすればいいか。
・検索画面でランダム表示か選べる場合
ランダム表示か、id順にするかは「モデルから問題を出力する条件」ではないから、現状のsearchに入れるのはどうするか
カラムを追加し、必ず3以上で登録させ、検索画面では1以上、2以上で選ばせる。そして、検索結果画面では1以上だったか、2以上だったかのif文で表示を変えるようにする。
→モデルの数だけ容量がデカくなっていくのは果たしてどうなのか
・検索結果画面では一覧で表示して、結果画面でランダムに並び替えられる場合
Javaでイベント発火すればいけるか
イベント発火→検索結果にshuffleメソッドを記入→
https://www.sejuku.net/blog/2531
reloadメソッドを使えばできそうか
どっちにしろ、検索結果画面で正規順、ランダムで変えられるようにはしたかったので、とりあえずこちらで実装するようにしてみる。
・検索結果画面に「ランダムで並び替える」を追加
・Javaファイルを作成「ランダムで並び替える」にクリックでイベント発火するようにする
reloadメソッドを使用して、クリックで「ページを更新する」はできたが
これをjavaで処理したい。
しばらく検索したが、特に使えそうなものにヒットしない。
現状の処理での問題点は、最初っからランダムで表示される。
当初の目的であった「検索するたびに並び順が変わる」は達成されている。しかし、
正しい順番に並びかえができない。
どちらにせよ、この@resultsをjava上で動かせないと正しい順番にもできない
しかし、元の構想通りに出力もしてみたいので、検索を続ける。