yamachan.log

紫陽花

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}

: *が配列展開 **がハッシュ展開

qiita.com