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

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

詳細はこちら
date

dateは、date型や日付に関する関数や処理についてのタグです

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

3183閲覧

【Rails5】日付間のデータを抽出したい

yastinbieber

総合スコア49

date

dateは、date型や日付に関する関数や処理についてのタグです

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2021/02/02 07:05

編集2021/02/02 07:10

前提・実現したいこと

Railsでの日付間のデータを抽出したいです。

Weightchangeテーブルにて体重の管理をしているのですが、日付間検索を用いてこれまでに記録してきた体重データを抽出できるようにしたいです。

現状、日付間検索をする場合の設計はできているのですが、
ページを開いたとき(まだ何も検索をかけていないデフォルト状態時)に期間内に記録した体重データを反映させたいと考えています。

ちなみにこの期間内に記録した体重データの期間というのは、
idealweightテーブルに先に入力しているstart_daylast_dayのことを指します。
そこの日付をweightchangeテーブルで使ってあげたいです。

発生している問題・エラーメッセージ

そこでデフォルトの日付間をセットするためweightchange.rbに記載をしております。

下記のように日付を直に書いてしまえば反映してくれるのですが、
カラム名を記載して反映させようとすると上手く反映がされません。

##反映される Weightchange.where(date: '2020-11-10'...'2021-02-28') ##反映されない Weightchange.where(date: 'idealweight.start_day'...'idealweight_last_day')

一応weightchange.rb全て

class Weightchange < ApplicationRecord belongs_to :user belongs_to :idealweight # 検索 scope :search, -> (search_params) do unless search_params.blank? date_from(search_params[:date_from]) .date_to(search_params[:date_to]) else #反映される # Weightchange.where(date: '2020-11-10'...'2021-02-28') #反映されない #Weightchange.where(date: 'idealweight.start_day'...'idealweight_last_day') end end scope :date_from, -> (from) { where('? <= date', from) if from.present? } scope :date_to, -> (to) { where('date <= ?', to) if to.present? } before_save do self.expected_weight = (idealweight.weight)-((idealweight.minusweight_day)*(user.what_day)) end end

イメージ説明

恐れ入りますが解決策をご教示いただけますと幸いです。

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

Rails5.2
ruby2.5.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

belongs_to :idealweight だとすると
Weightchange.joins(:idealweight). where("date BETWEEN idealweights.start_day and idealweights.last_day")
で行けないかな。

投稿2021/02/02 12:28

winterboum

総合スコア23567

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

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

yastinbieber

2021/02/02 12:32

コメントありがとうございます… うまくいきました!! 貴重なご意見ありがとうございます!!助かりました‥
guest

0

反映されない理由は、Rails(ActiveRecord)ではそういう命令の仕方を扱う機能がないからです。

SQLの世界とRailsの世界が曖昧になっているためにそういう使い方を試していらっしゃるように思います。

Weightchange.where(date: 'idealweight.start_day'...'idealweight_last_day')

このコードでやりたいことは

  • idealweightテーブルのstart_dayの値を取得する(SQLの世界)
  • idealweightテーブルのlast_dayの値を取得する(SQLの世界)
  • start_dayとlast_dayの値を用いて Rangeオブジェクトを生成する(Railsの世界)
  • weightchange テーブルに対し、dateカラムで上記のRangeオブジェクトにより範囲検索のSQLを組み立てる(Railsの世界)
  • 上のSQLでデータを取得する(SQLの世界)

という風になっていて、データベースとRailsの世界を行ったり来たりしながら都合の良いデータを取ってくれる事を期待しています。でも、そこまではちょっとできないですね。。これできるようにするのはめちゃくちゃ大変です。

現状できないのはどうしようもないので、こういうステップで対処することになります。

  • idealweightテーブルに先に入力している start_day と last_day をまず取得し、変数に格納する(start_day, last_dayとします)
  • Weightchange.where(date: start_day...last_day) という形で検索を実行する

基本的にはこんな流れで実行することになると思います。

投稿2021/02/02 09:48

oakbow

総合スコア227

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

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

yastinbieber

2021/02/02 11:25

ご回答ありがとうございます。 sqlとrailsに関する部分がごっちゃになってましたね… 代替案もありがとうございます。 認識が間違っていたら申し訳ないのですが、 ①weightchangeテーブルにstart_dayカラムとlast_dayカラムを作成する ②idealweightテーブルのstart_dayとlast_dayの内容をweightchangeのレコードが作成されるタイミングでbefore_saveか何かで差し込む ③Weightchange.where(date: start_day...last_day) で抽出(検索)する こんな認識であってますでしょうか‥
oakbow

2021/02/02 12:31

いえ、ちょっと違います。1と2の手順は不要です。 あくまで idealweight テーブルに保存済みの情報で範囲検索したいんですよね? だったらこの情報をあらかじめ取得して、変数などに保存しておいて3の条件に使用する、という流れです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問