12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby on Railsで動的にattributeに値を代入する方法

Last updated at Posted at 2018-10-29

動的に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引数の値が代入されます。なお、'='を追加するためには、式展開("#{}")することが必要です。

結構使う機会がありそうなので、メモしてみました。

12
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?