前提
- ruby on rails 6.0.0 を使用。
やりたいこと
- 変数を命名する際に他の変数を組み込む。
- times文を繰り返す中で、それぞれに数字をつけてtimeの数だけ変数を作りたい。
方法
railsに最初から定義されている instance_variable_set というメソッドを使用する。
instance_variable_set("変数名", 代入したい値)
先につけたい変数名を、後にその変数に代入したい値を記述することで、任意の変数を作ることができる。
イコールで直接変数を作る方が簡単ではあるが、つけたい変数名を""で囲ってあるためにその内部で別の変数を扱うことができるというメリットがある。
movies_controller.rb
def index
Tag.all.length.times do |num|
tag_point = 0
Movie.where(tag_id: num + 1).each do |movie|
tag_point += movie.evaluation
end
instance_variable_set("@tag#{num + 1}_point", tag_point)
end
end
このようにすることで、タグの数だけ処理を行いそれぞれで tag1_point, tag2_point といった変数を作ることができるようになる。
終わりに
ひとつひとつレコードの数だけ処理を書くのは大変かつ効率が悪いため、 length.times でまとめようとしたところ、イコールで直接変数を作る方法では変数名に変数を含めることができなかった。
このメソッドを使うことで変数の命名がより自由になるので是非覚えておきたい。