🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

1767閲覧

pluckメソッドで呼び出した日付の値を"2019-12-01"のような形式で表示したい。

jun3030

総合スコア16

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/12/07 14:08

前提・実現したいこと

pluckメソッドで呼び出した日付の値を(例)"2019-12-01"のような形式で表示したい。

調べても分からなかったので、お忙しいとは思いますが質問させてください。汗

現在日付をformatで
(例)"2019-12-01"の"12-01"の部分だけ取り出して表記したいと考えております。
ですがAttendance.pluck(:worked_on)で日付を取り出した際に値が
[Sun, 01 Dec 2019, Mon, 02 Dec 2019, Tue, 03 Dec 2019, Wed, 04 Dec 2019,,,,以下省略]
と配列でしかも曜日まで出てくるのでformatが適用できずに困っています。

[Sun, 01 Dec 2019]"2019-12-01"と変換する方法はありますか?
[Sun, 01 Dec 2019]"12/1"更に言えば最終的にはこのように表記したいです。

大変申し訳ないのですが何かアドバイス頂けないでしょうか。汗

該当のソースコード

ruby

1<% @user.each do |user| %> 2<tr> 3 <td><%= user.attendances.where.not(finish_schedule_time: nil).where(confirmation: "Superior User-1", approval: "申請中").pluck(:worked_on).strftime("%d") %></td> 4</tr> 5<% end %> 6 7#strftimeで狙った値を取り出そうとしましたが失敗しました。

試したこと

Attendance.find(1)
と入力し値を確かめたところ
Attendance id: 1, worked_on: "2019-12-01"
とここまではformatが適用できそうなのですがpluckメソッド呼び出した途端戻り値が変わります。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2019/12/07 16:01 編集

user.attendances.where.not(finish_schedule_time: nil).where(confirmation: "Superior User-1", approval: "申請中") が複数ある場合、どう表示される事を期待していますか?
jun3030

2019/12/07 16:59 編集

少々分かりづらいかもしれませんが、、汗  eachで取得したユーザーに紐づくattendamcesの情報を一つずつ表記させるつもりです。 複数あった場合もユーザー事にテーブルを作りそのユーザーに関連付たattendancesテーブルのカラム情報を表記します。 <% @user.each do |user| %> _ <p><h3 class="center">【<%= user.name %>】</h3></p> _ <table class="table table-bordered table-condensed user-table"> _ <tr> _ <td>日付</td> _ <td>曜日</td> _ <td>終了予定時間</td> _ <td>指定勤務終了時間</td> _ </tr> _ _ <tr> _ <td><%= user.attendances.where.not(finish_schedule_time: nil).where(confirmation: "Superior User-1", approval: "申請中").pluck(:worked_on) %></td> _ <td></td> _ <td></td> _ <td></td> _ <td></td> _ </tr> _ </table> _ <% end %> _ <%= f.submit "許可", class: "btn btn-primary btn-block" %> _ <% end %>
asm

2019/12/08 23:53

結局どうしたいのかわかりません。 とりあえず、具体的に12/01, 12/02, 12/03の3つの日付が一人のuserに関連づけられていた場合の期待している出力を出せますか? <td><%= user.attendances.where.not(finish_schedule_time: nil).where(confirmation: "Superior User-1", approval: "申請中").pluck(:worked_on) %></td> 部分だけでいいので
guest

回答3

0

自己解決

回答して下さった皆さんありがとうございます。
pluckで呼び出した戻り値は配列になる事は確定で、その上で変換するコードを書かないといけないという事ですね。
asmさんのおっしゃる
具体的に12/01, 12/02, 12/03の3つの日付が一人のuserに関連づけられていた場合の期待している出力を出せますか?という問いは、yesで日付ごとのattendanceの内容は表示できていました。しかし日付だけの情報を表示できていなかったのpluckで日付の情報を呼び出していました。それをeachで一つずつ表示していたのですが戻り値が配列の表記になってしまっていました。
結論は
<% (user.attendances.where.not(finish_schedule_time: nil).where(confirmation: "Superior User-1", approval: "申請中").order(:worked_on)).each do |attendance| %>
_ <td><%= l(attendance.worked_on, format: :short) %></td>
<% end %>

これで解決できました。
pluckを使うと配列で返ってくるのでそこから変換するより、最初から使わないようにしました。
今回は解決できましたが、次pluckを使う場合はtentenさんのおっしゃるmapメソッドでもやってみようと思います。
mapメソッド自体知らなかったので、これから活用していこうと思います。

お忙しい中本当にありがとうございました!汗

投稿2019/12/09 07:37

jun3030

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

pluckは戻り値は配列(もしくは配列の配列)です。仮に該当するレコードが一つしかなくても要素が一つの配列で戻ります。
該当するAttendancesが複数ある可能性が有るのでしたら、どのような方法でDBから値を取るにしても結果は配列(の様なもの、のばあいもありますが)で得るというつもりでプログラムして下さい。

その複数有る(かもしれない)結果をどう並べたいのか?それによってやり方が変わるというのが asm さんの言いたいことです

Date(かDateTimeか)の配列を"年月"というStringの配列にする方法がtentenさんの回答です。

投稿2019/12/09 00:05

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

mapメソッドを使うとどうなりますでしょうか。

<td><%= user.attendances.where.not(finish_schedule_time: nil).where(confirmation: "Superior User-1", approval: "申請中").pluck(:worked_on).map{ |date| date.strftime("%m/%d")} %></td>

上が成功すればこっちでもいけるかもです。

<td><%= user.attendances.where.not(finish_schedule_time: nil).where(confirmation: "Superior User-1", approval: "申請中").pluck(:worked_on).map(&:strftime("%m/%d")) %></td>

投稿2019/12/08 12:26

tenten11055

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問