動的にattributeに値を代入する方法
example.rb
hoge = Hoge.new
hoge.fuga = piyo
上記のように、インスタンス(hoge)のattribute(fuga)に値(piyo)を代入する際、attribute(fuga)、値(piyo)を動的に(変数で)代入したい場面があると思います。
使用例
例えば、Userモデルにexperience_categories(経験カテゴリー)といったattributeがあるとします。
sendメソッドを使うことで動的にattributeを定義できます。
uses_controller.rb
user = User.new
experience_category_params = [['deep_learning', 'has_exp'], ['block_chain', 'ovr_3yrs']] # とりあえずこのような配列で代入します
# 以下のようにattributeに値を代入していきます
experience_category_params.each do |experience_category_param|
user.send("#{experience_category_param[0]}=", experience_category_param[1])
end
puts user.deep_learning # =>'has_exp'
puts user.block_chain # =>'ovr_3yrs'
end
User.send(experience_category_param[0]) = experience_category_param[1]
としがちですが、syntax_errorとなります。
sendメソッドを使うとできます
sendメソッドは、第一引数にメソッド名、第二引数はそのメソッドに渡すパラメーターを定義します。
第一引数のメソッド名に目的のattribute名を書き、後ろに'='を加えることで、attributeに第2引数の値が代入されます。なお、'='を追加するためには、式展開("#{}")することが必要です。
結構使う機会がありそうなので、メモしてみました。