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

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

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

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

Active Record

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

Q&A

2回答

2268閲覧

RailsのActive Recordで2つ先のリレーションにwhereをつけることは可能か

get_luck

総合スコア12

Ruby on Rails

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

Active Record

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

0グッド

2クリップ

投稿2015/04/04 19:06

編集2022/01/12 10:55

Railsの質問です。
言葉では説明しにくいので、図を交えながら説明します。
A中学校1年のモデルがあるとして、その下に組モデル、
その下に生徒モデルがあるとします(それぞれ上下はbelong_to,has_manyで繋がってるとします。)

..................... [赤松]
............ [1組] [山田]

[A中学校1年] [2組] [高田]
................... [香取]

............ [3組] [松本]
...................... [小島]

と、こんな感じです。
この場合、A中学校1年の全生徒を身長順で取り出したい場合、どのような
active_recordを書けば良いでしょうか
クラスだけを取り出す場合なら

lang

1 school = School.find 1 2 school.classes.where ~

と書きます。
ここで、本題である身長順で取り出す場合

lang

1 student_list = [] 2 school = School.find 1 3 school.classes.each do |class| 4 class.students.each do |student| 5 student_list << student 6 end 7 end 8 9 #(省略)student_listを身長順に並べる処理 10

と、私の思いつく限り、このような書き方しかでません。
もっと短いコードで取り出す方法はありませんでしょうか。
できれば、studentモデルにwhereをかけてやりたいです。

よろしくおねがいします。

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

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

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

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

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

guest

回答2

0

lang

1students = Student.eagerload(:class).where(class: {school_id: 1}).order(height: :asc)

eagerloadで組テーブルをつないだ方法ではダメですか?

投稿2015/04/13 06:17

AijiUejima

総合スコア7

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

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

0

こんな感じでしょうか。

lang

1students = Student 2 .where(class_id: Class.where(school_id: 1)) # id:1 の学校の全生徒 3 .order(height: :asc) # 身長の低い順

投稿2015/04/04 22:46

hello-world

総合スコア1342

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

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

get_luck

2015/04/05 04:50

回答ありがとうございます。 その記述方法で可能なのですが、できればリレーション関係を活かした書き方をしてみたいです。 以下は動作しませんが s = School.find 1 s.classes.all.students.where().order(height: :asc) みたいな、ドットでつないで、生徒の身長順に取り出す方法はありますでしょうか? よろしくおねがいします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問