0
0

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 1 year has passed since last update.

mapメソッドで2次元配列の要素を変換したい

Last updated at Posted at 2023-03-09

はじめに

業務で詰まったのでメモ

データベースから、記事一覧(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]]

と返ってきました

変換前の配列と、変換後の配列を教えたら、ちゃんとコメント付きのコードを返してくれました(感動)

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?