はじめに
業務で詰まったのでメモ
データベースから、記事一覧(Articlesテーブル)の情報をとってきて、
タイトル(title)
と出版日(published_at)
を2次元配列で返したい時の処理です。
pluck
メソッドを使って以下のようにデータを取得して、指定したカラムのレコードの配列を取得できます。
article = Article.where(条件).pluck(:title, :published_at)
> [["article1", Thu, 31 Dec 2022], ["article2", Wed, 31 Mar 2023]]
やりたいこと
-
Thu, 31 Dec 2022
(Date型)を2022-12-31
(String型)に変換した配列を出力したい!
このように↓
[["article1", "2022-12-31"], ["article2", "2023-3-31"]]
-
具体的には、
article1
(配列[0]の配列の[0]の要素)はそのままで、
"2022-12-31"
(配列[0]の配列の[1]の要素)をThu, 31 Dec 2022
から"2022-12-31"
に変換した配列を出力したい。
コード
Article.where(条件).pluck(:title, :published_at).map { |a| [a[0], a[1].strftime('%Y-%m-%d')] }
> [["article1", "2022-12-31"], ["article2", "2023-3-31"]]
- mapメソッドをメソッドチェーンして一行で書けます(簡潔)
-
strftime('%Y-%m-%d')
メソッドを使うことで、文字列を指定のフォーマットで表示できます。
.map { |a| [a[0], a[1].strftime('%Y-%m-%d')] }
終わりに。ChatGPTすごい
自分は最初、{ |a| a[0], a[1].strftime('%Y-%m-%d') }
と書いていて、
[]がなかったため、SyntaxErrorになってました。
each
で変換して配列にpushするしかないのか?って小一時間悩んでましたが、
なんとChatGPTに聞いたら一瞬でした。。。
ちなみにどんなふうに質問したかというと
Rubyのメソッドを使って
array = [["aaa", 1], ["bbb", 2]]
を
[["AAA", 1], ["BBB", 2]]
にしてください
と聞くと、なんと
array = [["aaa", 1], ["bbb", 2]]
# mapメソッドを使用して、各要素の最初の文字列を大文字に変換します。
# 最初の文字列以外の要素はそのままにします。
result = array.map { |sub_array| [sub_array[0].upcase, sub_array[1]] }
p result #=> [["AAA", 1], ["BBB", 2]]
と返ってきました
変換前の配列と、変換後の配列を教えたら、ちゃんとコメント付きのコードを返してくれました(感動)