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

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

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

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

Ruby on Rails

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

Active Record

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

Q&A

解決済

2回答

10833閲覧

Rails小モデルから親モデルの情報で検索したい

indi

総合スコア26

Ruby on Rails 5

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

Ruby on Rails

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

Active Record

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

0グッド

1クリップ

投稿2019/08/31 07:31

編集2019/08/31 10:25

下記のようなモデルがあるとき、
ItemモデルのcategoryカラムとUserモデルのnameカラムでOR検索をしたいです。
つまりcategoryがある、もしくはuserのnameがあるというItemを取得したいです。

class User < ApplicationRecord # name, user_codeカラムをもつ has_many :items, foreign_key: :user_code, primary_key: :user_code, inverse_of: :user end class Item < ApplicationRecord # category, user_codeカラムを持つ belongs_to :user, class_name: "User", foreign_key: :user_code, primary_key: :user_code, optional: true end

↓のようなコードで試しているのですがうまくいきません。

Item.includes(:user).where(category: "hobby").or(Item.includes(:user).where("users.name = 'tom'"))

どのようにしたらよいでしょうか?

追記

Item.includes(:user).where("users.name = 'tom'")

この部分がとれてないようです。
SQLとしては、

SELECT * FROM items WHERE(users.name = 'tom')

のようになっているのですが、結果が以下のようになってしまいます。
includesがうまくできていないようです。

#<Item::ActiveRecord_Relation:0x2ae7b0251a30>

エラーメッセージ

ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block : SELECT "items"."id" AS t0_r0, "items"."category" AS t0_r1, "items"."user_code" AS t0_r2, "items"."created_at" AS t0_r3, "items"."updated_at" AS t0_r4, "users"."id" AS t1_r0, "users"."user_code" AS t1_r1, "users"."name" AS t1_r2, , "users"."created_at" AS t1_r3, "users"."updated_at" AS t1_r4 FROM "items" LEFT OUTER JOIN "users" ON "users"."user_code" = "items"."user_code" WHERE ("users"."name" = $1 OR "items"."category" = $2) ORDER BY "items"."id" DESC LIMIT $3

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/31 07:52

エラー内容を載せてください。
indi

2019/08/31 07:59

エラーメッセージを載せました。
guest

回答2

0

Item.includes(:user).where(users: {name:'tom'})

投稿2019/08/31 08:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

indi

2019/08/31 08:13

StatementInvalidはでなくなりましたが、 検索結果が空([])になってしまいます。 User.where(name: "tom")では結果がでるので、DBに内容は入っています。
退会済みユーザー

退会済みユーザー

2019/08/31 08:35 編集

Item.includes(:user) でuserテーブルのデータのSELECTは動いていますか?
indi

2019/08/31 08:37

Item.includes(:user).to_sql の結果 SELECT \"items\".* FROM \"items\" ORDER BY \"items\".\"id\" ASC" のようになってしまいます。
退会済みユーザー

退会済みユーザー

2019/08/31 08:51

Item.includes(:user).where(users: {name:'tom'}).to_sql は下記のような内容になると思います。 ``` SELECT items.* FROM items LEFT OUTER JOIN `users` ON `users`.`code` = `items`.`user_code` WHERE `users`.`name` = 'tom' ``` これを実行できる環境で値は取れますか?
indi

2019/08/31 09:00 編集

実行したところSQLは以下のようになり、値は[]で返ってきてしまいます。 ``` "SELECT \"items\".\"id\" AS t0_r0, \"items\".\"user_code\" AS t0_r1, \"items\".\"category\" AS t0_r2, \"items\".\"created_at\" AS t0_r3, \"items\".\"updated_at\" AS t0_r4, \"users\".\"id\" AS t1_r0, \"users\".\"user_code\" AS t1_r1, \"users\".\"name\" AS t1_r2, \"users\".\"created_at\" AS t1_r3, \"users\".\"updated_at\" AS t1_r4, FROM \"items\" LEFT OUTER JOIN \"users\" ON \"users\".\"user_code\" = \"items\".\"user_code\" WHERE \"users\".\"name\" = 'tom' ORDER BY \"items\".\"id\" ASC" ```
guest

0

ベストアンサー

Item.includes(:users)

Item.includes(:user)

で試して下さい
### 追記
Item.includes(:user).where("users.name = 'tom'")
ではないな
Item.joins(:user).where("users.name = 'tom'")
です。
Relationが返るのは問題ないです。配列で戻ってきているつもりで扱って下さい。

投稿2019/08/31 07:34

編集2019/08/31 08:16
winterboum

総合スコア23267

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

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

indi

2019/08/31 07:40

すいません、こちらはtypoでした。 userになっているのですが、動きません。
winterboum

2019/08/31 07:46

どういう症状か書いて下さい。 あと、 エラーを起こしたcodeをそのままコピペして下さい。
indi

2019/08/31 08:01 編集

上記に追記しました。 上記を実行すると ` #<Item::ActiveRecord_Relation:0x2ae7b0251a30>` ActiveRecorde::Relationのインスタンスが返ってきてしまいます。 エラーメッセージも追記しました。
indi

2019/08/31 08:23

` Item.joins(:user).where("users.name = 'tom'")`試したのですが、データの取得ができませんでした。
indi

2019/08/31 08:25

ちなみにSQLはいかのようになりました。 `"SELECT \"items\".* FROM \"items\" INNER JOIN \"users\" ON \"users\".\"user_code\" = \"items\".\"user_code\" WHERE \"users\".\"name\" = ''tom" ORDER BY \"items\".\"id\"`
indi

2019/08/31 08:27

User.where(name: 'tom')だとデータは取得できています。
winterboum

2019/08/31 09:48

tom が作った itemはあるのですね? 二つ下さい 1) User と Item の関連定義部分 2) rails console で試して下さい user_code = User.find_by(name: 'tom').user_code Item.where(user_code: user_code) 結果はどうなります?
indi

2019/08/31 10:33

空でした。 なるほど理由がわかりました。 tomが作ったアイテムが存在してなかったようでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.54%

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

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

質問する

同じタグがついた質問を見る

Ruby on Rails 5

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

Ruby on Rails

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

Active Record

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