質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Ruby on Rails 6

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

Q&A

解決済

2回答

473閲覧

ルーティングに個別のid情報を持たない、indexアクションなどで、個別の投稿情報を取得して、各種計算をするにはどうすればよいか

naoki0803

総合スコア1

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/12/13 15:28

前提

Ruby(Rails)を利用して、誕生日などの記念日を管理するアプリを作成しています。
登録した記念日を一覧表示して、「次の記念日まで何日か」「次は何日記念か」
などを表示させたいです。

実現したいこと

  1. 記念日からの経過日数を計算し、配列に設定した次の記念日候補と一致する値を表示させるには、 controller、あるいはモデルにどのように記述すればよいか。 ※例:次は100日記念日です。次は10年記念日です。などと表示させたい
  2. ルーティングに個別のid情報を持たない、indexアクションなどで、個別の投稿情報を取得して、各種計算をするにはどうすればよいか確認したい。

※現状はcontroller内で、Userに紐づく記念日の投稿情報を全て取得 ⇨ Viewでeachメソッドを利用して一覧出力しています

該当のソースコード

ruby

1class ListsController < ApplicationController 2 def index 3 @user = User.find(params[:user_id]) 4 @anniversaries = @user.anniversaries 5 end 6end

↑@anniversariesにUserに紐づく記念日の情報を代入していますが、個々の記念日情報に対して計算をするなどしたいです。

ruby

1Rails.application.routes.draw do 2 devise_for :users 3 resources :anniversaries 4 resources :users, only: [:index, :show] do 5 resources :lists, only: :index 6 end 7end

※listsモデルはUserモデルにネストしています。

ruby

1<div class="container"> 2 <table class="table"> 3 <caption>ブレークポイント</caption> 4 <thead> 5 <tr class="column"> 6 <th></th> 7 <th>記念日</th> 8 <th>経過日数</th> 9 <th>次の記念日名</th> 10 <th>次の記念日の日付<br>残日数</th> 11 </tr> 12 </thead> 13 14 <tbody> 15 <% @anniversaries.each do |anniversary| %> 16 <tr> 17 <td><%= image_tag anniversary.image %></td> 18 <%# 記念日 %> 19 <td><%= anniversary.anniversary_date %></td> 20 <%# 経過日数 %> 21 <td><%= "#{(@today - anniversary.anniversary_date.next_day(0)).to_i}日" %></td> 22 <%# 次の記念日名 %> 23 <td><%= "#{条件に一致する、次の記念日までの日数を返したい}日記念" %></td> 24 <%# 次の記念日の日付 %> 25 <td><%= (anniversary.anniversary_date.next_day(条件に一致する、次の記念日までの日数を返したい)) %><br> 26 <%# 残日数 %> 27 <%= "残り#{(anniversary.anniversary_date.next_day(条件に一致する、次の記念日までの日数を返したい) - @today).to_i}日" %></td> 28 </tr> 29 <% end %> 30 </tbody> 31 </table> 32 </div>

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

ruby 2.6.5

至らない説明などあるかもしれませんが、よろしくお願いします。

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

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

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

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

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

maisumakun

2022/12/14 00:17

> ※現状はcontroller内で、Userに紐づく記念日の投稿情報を全て取得 ⇨ Viewでeachメソッドを利用して一覧出力しています この現状ではどのような問題があるのでしょうか?
naoki0803

2022/12/14 00:54 編集

コメントをありがとございます。確かに問題がうまく説明できていませんでした。 現状の問題点は、次の記念日候補を動的に表示させる事ができない点になります。 例えば、 controller上で「@next_anniversary = 1000」をインスタンス変数としておいて、 View上でeachメソッドを活用して、出力した全てのデータに対して「次の記念日は1000日後です」 と表示することはできても、誕生日などの記念日は人によって異なるので、@next_anniversaryに代入する値を、それぞれの次の誕生日候補を代入して、eachメソッドで出力した各データ別に、次の記念日は100日記念や、次の記念日は500日記念というふうにViewに表示をさせたいです。 show アクションであればあらかじめ個別のid情報が、showアクションを実行する時点で取得できているので実装できそうですが、あくまでindexアクションなど実行される時点で個別のid情報を持っていない状態でどのように実装すればいいかがわからないです。 ---ruby <% @anniversaries.each do |anniversary| %>   <%# 記念日の日付 %> <%= anniversary.anniversary_date %>   <%# 次の記念日候補 %> <%= "#{@next_anniversary}日記念" %><   <%# 次の記念日の日付 %> <%= (anniversary.anniversary_date.next_day(@next_anniversary)) %> ---
guest

回答2

0

@next_anniversaryに代入する値を、それぞれの次の誕生日候補を代入して

インスタンス変数として持たずに、各記念日についてビューで計算させればいいだけではないでしょうか?

投稿2022/12/14 00:56

maisumakun

総合スコア145184

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

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

naoki0803

2022/12/16 14:30

ありがとうございます!計算はModelやcontrollerで行わないといけないと勝手に思い込んでいました!! Viewで計算する事で解決する事ができました。 ありがとうございました。
guest

0

ベストアンサー

記念日からの経過日数を計算し、配列に設定した次の記念日候補と一致する値を表示させるには、 controller、あるいはモデルにどのように記述すればよいか。 ※例:次は100日記念日です。次は10年記念日です。などと表示させたい

方法1.indexアクションで日付が近い順に取得する。(whereで絞ってorder_byで順番を揃える)
※DBに記念日カラムの型がdatetimeだと容易に実装できそう
https://qiita.com/tsuchinoko_run/items/c31ed7e0b0672e6d898a
https://pikawaka.com/rails/where

方法2.取得した内容をjavascriputで並び替える

方法1の方が楽に実装できるかなとは思います!

ルーティングに個別のid情報を持たない、indexアクションなどで、個別の投稿情報を取得して、各種計算をするにはどうすればよいか確認したい。

一覧で取得した後に、for文とかで1つずつ処理していく必要があります。
anniversaries[i]とかで各データを確認できると思います。(コードをちゃんと見てるわけじゃないので、試してもらうのが一番です)

投稿2022/12/13 16:13

kobu

総合スコア118

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

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

naoki0803

2022/12/14 00:36

早速の返信ありがとうございます。 日中は作業ができないので、夜にfor分を使った処理を試してみようと思います。 indexアクションでfor分で個別情報を取得して、取得した情報それぞれに対して、配列に登録してある次の記念日候補に該当するものを返して、さらにそれをviewで表示する場合、インスタンス変数はどのように渡してあげれば良いのでしょう。
kobu

2022/12/15 14:36

DBの構造が分からないため、憶測を含みますが今のようなSQLをindexアクションで意識すれば実装可能かと思います。 select * fomr anniversaries where {記念日のdateTime} >= DATE(NOW()) order by {記念日のdateTime} limit 1 もしくは、全件取得しといてフロント側で今日以降の記念日を判定するかですね!
naoki0803

2022/12/16 14:29

ありがとうございます!! SQL文の記載がわからなかったのですが、findメソッドを活用して実装ができました。 SQL文も勉強しようと思います!! 【controller】 @today = Date.current @anniversary_lists = [100,200,300,400,500,1000,3000,5000] 【View】 <%# 次の記念日名 %> <%= "#{next_anniversary_num = @anniversary_lists.find {|x| (@today - anniversary.anniversary_date.next_day(0)) < x }}日" %> <%# 次の記念日の日付 %> <%= (anniversary.anniversary_date.next_day(next_anniversary_num.to_i)) %><br> <%# 残日数 %> <%= "残り#{(anniversary.anniversary_date.next_day(next_anniversary_num.to_i) - @today).to_i}日" %>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問