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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

1371閲覧

重複がある場合は最新のものを参照したい

aicocot

総合スコア6

Ruby

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

1グッド

1クリップ

投稿2020/01/25 02:35

編集2020/01/25 09:22

テーブルは下記の通り。

ruby

1create_table "reactions", force: :cascade do |t| 2 t.integer "to_photo_id", null: false 3 t.integer "from_user_id", null: false 4 t.integer "status", null: false 5 t.datetime "created_at", null: false 6 t.datetime "updated_at", null: false 7 end

現状のデータベースは下記の通り。

sqlite

1id|to_photo_id|from_user_id|status|created_at|updated_at 2115|20|4|0|2020-01-24 16:47:34.029729|2020-01-24 16:47:34.029729 3★116|19|4|1|2020-01-24 16:47:35.470992|2020-01-24 16:47:35.470992 4117|18|4|0|2020-01-24 16:47:43.841167|2020-01-24 16:47:43.841167 5★118|17|4|1|2020-01-24 16:47:48.417951|2020-01-24 16:47:48.417951 6119|16|4|0|2020-01-24 16:52:36.698128|2020-01-24 16:52:36.698128 7120|15|4|0|2020-01-24 16:52:37.322925|2020-01-24 16:52:37.322925 8121|14|4|0|2020-01-24 16:52:37.857629|2020-01-24 16:52:37.857629 9122|13|4|0|2020-01-24 16:52:38.355283|2020-01-24 16:52:38.355283 10123|12|4|0|2020-01-24 16:52:38.841234|2020-01-24 16:52:38.841234 11124|11|4|0|2020-01-24 16:52:39.537211|2020-01-24 16:52:39.537211 12125|10|4|0|2020-01-24 16:52:40.085418|2020-01-24 16:52:40.085418 13126|9|4|0|2020-01-24 16:52:40.537790|2020-01-24 16:52:40.537790 14127|8|4|0|2020-01-24 16:52:40.952935|2020-01-24 16:52:40.952935 15128|6|4|0|2020-01-24 16:52:41.351016|2020-01-24 16:52:41.351016 16129|5|4|0|2020-01-24 16:52:41.867081|2020-01-24 16:52:41.867081 17130|19|2|0|2020-01-24 16:53:50.398350|2020-01-24 16:53:50.398350 18131|17|2|0|2020-01-24 16:54:05.624367|2020-01-24 16:57:43.336454 19132|7|2|0|2020-01-24 16:54:06.208412|2020-01-24 16:54:06.208412 20133|4|2|0|2020-01-24 16:54:07.498411|2020-01-24 16:54:07.498411 21134|1|2|0|2020-01-24 16:54:29.081213|2020-01-24 16:54:29.081213

やれたいこと

『status 0 な Reaction が1つもついていない to_photo_id』を選び出すことです!

一度statusのところにlike(0)のついたto_photo_idは抽出したくないのですが、
現状上記星印で示すように過去にdislike(1)がついたto_photo_idが出力されてしまっています。
表題の通り、あるカラムにおいて重複がある場合は最新のもののみ抽出対象とできらば行けそうな気がしているのですが調べても芳しいものが見当たらず。お手数おかけしますがよろしくお願いします。

現状、コントローラーは下記の通り。

ruby

1 @photos = photo.left_outer_joins(:reactions).where.not(photos: { user_id: current_user.id}).where("reactions.from_user_id != ? or reactions.from_user_id is null",current_user.id).where(reactions: { status: [1,nil]})

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

特にエラーではないですが、ターミナルに流れているものを掲載しておきます。

Started POST "/reactions" for ::1 at 2020-01-25 11:28:24 +0900
Processing by ReactionsController#create as /
Parameters: {"photo_id"=>"17", "reaction"=>"like"}
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]]
↳ app/controllers/application_controller.rb:19
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 2], ["LIMIT", 1]]
↳ app/controllers/reactions_controller.rb:4
Reaction Load (0.1ms) SELECT "reactions".* FROM "reactions" WHERE "reactions"."to_user_id" = ? AND "reactions"."from_user_id" = ? LIMIT ? [["to_user_id", 17], ["from_user_id", 2], ["LIMIT", 1]]
↳ app/controllers/reactions_controller.rb:4
(0.0ms) begin transaction
↳ app/controllers/reactions_controller.rb:5
Photo Load (0.1ms) SELECT "photos".* FROM "photos" WHERE "photos"."id" = ? LIMIT ? [["id", 17], ["LIMIT", 1]]
↳ app/controllers/reactions_controller.rb:5
Photo Load (0.1ms) SELECT "photos".* FROM "photos" WHERE "photos"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]]
↳ app/controllers/reactions_controller.rb:5
(0.0ms) commit transaction
↳ app/controllers/reactions_controller.rb:5
No template found for ReactionsController#create, rendering head :no_content
Completed 204 No Content in 306ms (ActiveRecord: 0.7ms)

DrqYuto👍を押しています

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

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

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

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

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

winterboum

2020/01/25 05:39

「あるカラムにおいて重複がある場合は最新のもののみ抽出対象」と抽象・一般的な表現ではなく、具体的に 抽出条件を定義亭ください
aicocot

2020/01/25 06:20

すみません。解決策として考えてみた方法論として抽象度の高い記述をいたしました。 やりたいことは記載の通りで 「一度statusのところにlike(0)のついたto_photo_idは 過去にdislikeがついていたとしても抽出しない。」 ということです。 抽出条件に関してはコントローラーに記載の通りです。 よろしくお願い申し上げます。
aicocot

2020/01/25 06:30

・current_user.idの投稿でないこと ・過去にcurrent_user.idがreactionしていないこと ・既に誰かがlikeしていないこと 上記3つの条件で抽出したく。 例えば、だれかがto_photo_id:10にlikeをした際に、 過去に同じto_photo_id:10へ他の人がdislikeしたことで生成されたレコードも抽出されないようにしたいです。
winterboum

2020/01/25 06:43 編集

コントローラーにかかれているのでは不満なので質問してますよね? ですから、「抽出条件に関してはコントローラーに記載の通りです。」ではないのでは? 「一度statusのところにlike(0)のついたto_photo_idは過去にdislikeがついていたとしても抽出しない。」もわからないのです。 「dislike」とはなんですか? status が1ということ? そうはっきり書かないと回答側は不安です。 『sutatus 1 な Reaction が一つもついていない Photo』を選び出す ということですか? 逆か 『sutatus 0 な Reaction が一つもついていない Photo』を選び出す ですか? 「
winterboum

2020/01/25 06:44

like と dislike はどこを見て判断?
aicocot

2020/01/25 07:00

指摘されると提供していた情報の抜け漏れに気づきますね。 ありがとうございます! like=0 dislike=1で、最後のご質問は下記の方です! status 0 な Reaction が一つもついていない Photo』を選び出す お手数おかけしてすみません。
winterboum

2020/01/25 07:10

そうしますと、載せてある selectn結果から、抽出される可能性の有るのは Photo 2,3か21以上ですね。 私にはちと手強いので時間下さい。 判る人が先に回答していただけたらそれもよし。
aicocot

2020/01/25 07:17

はい。おっしゃる通りです。 自分がここで質問させていただいたきっかけは、17,19が既にlike(0)がついてるのに抽出されてしまったことでした。 お忙しい中ありがとうございます。。。 自分も引き続きリサーチします。
guest

回答2

0

ベストアンサー

サブクエリを使って一回のqueryで済ませる方法を考えようとしているのですが、なかなか逃避時間帯にならない、、

2回通すのととりあえず

ids = Reaction.where(status: 0).pluck(:to_photo_id) @photos = photo.left_outer_joins(:reactions) .where.not(id: ids). .where("reactions.from_user_id != ? or reactions.from_user_id is null",current_user.id) .where(reactions: { status: [1,nil]})

from_userの記述がダブったので削除しました。
ので、このした2行は関係なくなりました

not のを一つにまとめないでください。
まとめると  『「両方を満足するもの」ではないもの』になってしまうので、片側だけ成立がhitしてしまいます。

追記
最後の .where(reactions: { status: [1,nil]}) は不要、有害かも
ReactionがないPhotoも有りますよね?それはhitして欲しい。。
だとすると、この最後の条件は外してください

投稿2020/01/25 10:58

編集2020/01/25 11:07
winterboum

総合スコア23329

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

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

aicocot

2020/01/25 11:21

こちらでテストしたところ実装できました! また、質問の仕方への助言、不要なコーディングのご指摘などエラーの解消以上に 学びがありました。 ありがとうございました!
guest

0

これが使えそうなのですがいかがでしょう?

Active Record テーブルの結合や結合したテーブルを利用した検索や集計やソートについて

ruby

1@photos = photo.left_outer_joins(:reactions) 2 .where.not(photos: { user_id: current_user.id}, reactions: { status: 0 }) # ←ここだけ修正しました 3 .where("reactions.from_user_id != ? or reactions.from_user_id is null",current_user.id) 4 .where(reactions: { status: [1,nil]}) 5 6# ※私は生のSQLは書けないので、3行目の意味はわかってません

質問文の中の言葉がときどき矛盾しているようなので、一応確認ですが、一度でも status が 0 の reaction がついていたら、その photo は除外するということで大丈夫ですよね?


  • 補足

余分なwhere文がついているような気もするので、不要なものは削除するとすっきりすると思います

投稿2020/01/25 09:57

編集2020/01/25 10:00
siruku6

総合スコア1382

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

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

winterboum

2020/01/25 10:46

.where.not(photos: { user_id: current_user.id}, reactions: { status: 0 }) これですと、status 1 のrelation のあるPostはhitしてしまいます
siruku6

2020/01/25 10:51 編集

status 1 の reaction のある photo も除外したいのでしょうか? 質問文の中の、要件に関する記述が矛盾しているように見えたので、どれが本当に求めている条件なのかいまいちわかりません....
winterboum

2020/01/25 10:59

質問に付いているコメントの 2020/01/25 16:00 のを参照
aicocot

2020/01/25 11:10

siruku6さんありがとうございます。 記述不足で申し訳ないのですが、statusは最初全てnilでスタートします。 上記の方法ですと、nilがあるデータを抽出できないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問