Rubyの配列展開 *[a, b, c]
Rubyの配列展開
array = ["a", "b", "c"] *array # => a # => b # => c
arrayのオブジェクトが入った変数の先頭に*(アスタリスク)をつけることでarray[0] array[1] array[2] の出力をしてくれる。
Rubyの中でも地味な機能ではあるけれども便利。筆者はこの機能で救われた。
動的に変わる引数に対してActiveRecordでLIKE検索を行いたい時に役に立った。
CSV.foreach(path) do |keywords| keywords.join(", ").split.each do |keyword| query << 'title LIKE ?' words << "'%#{keyword}%'" end item_count = Item.where(query.join(" AND "), *words).count end
プレースホルダーにするのはSQLインジェクションなどを考慮してです。
上記では"title LIKE ?" のクエリがkeywordsの数動的に生成され、*wordsで配列展開が行われクエリの引数がkeywordsの値分出力されてSQLになります。
まだまだRubyへの理解が足りないな。。。。
追記
メソッドの引数に*をつけると可変長になるらしい。
: **とアスタリスクを2つ並べると配列ではなくハッシュ{}形式の可変長になるそうだ!!
hash = { a: 1, b: 2, c: 3 } p *hash #=> [:a, 1] #=> [:b, 2] #=> [:c, 3] p **hash #=> {:a=>1, :b=>2, :c=>3}
: *が配列展開 **がハッシュ展開