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

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

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

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

Q&A

解決済

1回答

3118閲覧

Railsのテーブル結合でwhere.notをしましたが...

axax90

総合スコア120

Ruby on Rails

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

0グッド

0クリップ

投稿2016/05/31 23:18

UserがScheduleに対して日課を記録します。
各モデルは以下の通りです。

# == Schema Information # # Table name: users # # id :integer not null, primary key # name :string(255) # created_at :datetime not null # updated_at :datetime not null # class User < ActiveRecord::Base has_many :schedules end
# == Schema Information # # Table name: schedules # # id :integer not null, primary key # do_date :date # user_id :integer # created_at :datetime not null # updated_at :datetime not null # class Schedule < ActiveRecord::Base belongs_to :user end

↓で先月に1日でも日課を行ったUserを取得できます。

start_day = Date.today.prev_month.beginning_of_month end_day = Date.today.prev_month.end_of_month User.includes(:schedules).where(schedules: { do_date: [start_day..end_day] })

これを、where.notにして、先月に日課を全く行っていないUserを取得できると思いましたが、
何も出てきません。

start_day = Date.today.prev_month.beginning_of_month end_day = Date.today.prev_month.end_of_month User.includes(:schedules).where.not(schedules: { do_date: [start_day..end_day] })

先月に日課を全く行っていないUserを取得するには、どうすればよいでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

関連を持っていないカラムのみを抽出するのって、結構面倒で頭使いますよね。
もっといいクエリを考えられる人がいるかもしれないので、一つのアイディアとして見てください。

1.目的のスケジュールを持つユーザーを抽出
2.母集団(全ユーザー)から1.の結果を除外したリストを取得する

というプロセスで進めるので、サブクエリを発行してnot inで抽出する

Ruby

1u_table = User.arel_table 2s_table = Schedule.arel_table 3 4sub = u_table.project(s_table[:user_id]) 5 .where(s_table[:start_day].gt(start_day) 6 .and(s_table[:end_day].lt(end_day))) 7result = User.where(u_table[:id].not_in(sub)).all

という感じでしょうか。

投稿2016/06/01 02:34

rifuch

総合スコア1901

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

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

axax90

2016/06/02 08:11

回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問