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

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

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

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

Ruby on Rails

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

Active Record

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

Q&A

解決済

1回答

1511閲覧

子テーブルに条件を指定すると親レコード数まで消える謎

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

Ruby on Rails

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

Active Record

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

0グッド

0クリップ

投稿2018/12/03 09:32

編集2018/12/04 00:51

user モデルが has_many: points をもっていて
ユーザごとに point モデルがもっている point 値の合計をソートしてランキングしたいです
とりあえずランクをつけるところは後回しでまずはユーザごとのポイント合計をソートして出力したいんですが

集計する point に特定期間という条件をつけたときに

users.includes(:points) .where(points: {created_at: term_since..term_until}) .group('users.id') .order('point desc') .sum(:point) .each do |k, v| p "#{k} #{v}" end

とかいたところ where の期間にデータがないとユーザレコードごと削除されてしまいます
期間内に point レコードがない場合もスコア 0 として出力したいので
先に points のテーブルをしぼってから includes したくて以下のようにかいたところ

users.includes(Point.where(created_at: term_since..term_until)) .group('users.id') .order('point desc') .sum(:point) .each do |k, r| p "#{k} #{r}" end

ActiveRecord::ConfigurationError: #<Point ...
というエラーになります

こういう場合どうすれば includes 先にデータがない場合も sum の値を 0 として取り出せるでしょうか

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

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

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

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

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

guest

回答1

0

ベストアンサー

絞り込んだレコードで外部結合すれば集計されると思います。

ruby

1User.joins("LEFT OUTER JOIN points ON points.user_id = users.id AND 条件").group(:id).sum(:point) 2

投稿2018/12/04 01:04

編集2018/12/04 01:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/12/04 05:19

こんな長い書き方があるんですね キーワードを調べてみます ありがとうございました
退会済みユーザー

退会済みユーザー

2018/12/04 06:34

長い書き方というかSQL文が入っています。 joinした後にwhereすると子レコードを持たない親レコードは弾かれてしまうので JOIN ONに絞り込み条件を入れて子レコードを絞り込んだ後でjoinしています。 JOIN ONに絞り込み条件を入れるにはSQL文をそのまま書き込むしかなさそうだったのでそうしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問