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

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

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

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

Ruby on Rails

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

Q&A

解決済

3回答

777閲覧

rubyでオブジェクトの配列から条件一致するもののみを抽出したい

you88

総合スコア147

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/13 13:13

基本的な質問で申し訳ないんですが下記でactive recordで抽出したオブジェクトの配列で条件に合うもののみを再度抽出したいんですがどうですればいいでしょうか?

@plans = Plan.find(plan_ids) # 上記でidの配列で複数のplanオブジェクトを@plansに入れています account_user_plans = @plans.select(user_id: account_user.id) これを特定のuser_idのもののみを抽出したいので上記で記述

selectではないと思うんですがここの適切な書き方ってあるでしょうか?

特定のuser_idの@plansをオブジェクトで抽出したいです。

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

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

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

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

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

guest

回答3

0

ruby

1@plans = Plan.where(id: plan_ids) 2 3account_user_plans = Plan.where(user_id: account_user.id, id: plan_ids) 4# account_user_plans = @plans.where(user_id: account_user.id)

もし user has plans, plan belongs_to user となっているなら、

ruby

1account_user_plans = acount_user.plans.where(id: plan_ids)

投稿2021/06/13 15:26

katoy

総合スコア22324

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

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

0

いや、、、
find は id の配列を与えることも出来ます。
ただ、plans_by_find = Plan.find(ids)plans_by_where=Plan.where(id: ids) では結果がやや異なります。
plans_by_find は インスタンスの配列ですが、plans_by_where は リレーションです。

ので、user_id: account_user.id なものを抜き取る方法が異なります。
plans_by_find.find{|plan| plan.user_id == account_user.id }
plans_by_where.find_by(user_id: account_user.id)

select で行うと 中身が一つの配列が帰ってくるので 更に first とかが必要です。
後者も find_by でなく whereでやれますが、その場合も配列(のようなもの、リレーション)が帰ってくるので firstが必要です。

投稿2021/06/13 13:59

編集2021/06/13 14:01
winterboum

総合スコア23567

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

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

0

ベストアンサー

大前提の知識

findは引数にidを取り、1件のレコードだけを取得します。
配列=複数レコードを取得する事はできません。
また、該当するレコードがない場合、例外が発生し処理が停止します。

したがって、複数のレコードを取得したい場合findは使えません。
複数レコードを取得したいなら、whereを使います。

それを踏まえて

例えば、複数のplan_idに対応するレコードの検索はこうなります。

ruby

1plan_ids = [1,2,3] 2 3# SELECT * FROM plans WHERE id IN (1, 2, 3) 4@plans = Plan.where(id: plan_ids)

さらにuser_id = account.user_idで絞りたいならAND条件なので、where()を重ねます。

ruby

1plan_ids = [1,2,3] 2 3# SELECT * FROM plans WHERE id IN (1, 2, 3) AND user_id = 1 4# ※account_user.id = 1の場合 5@plans = Plan.where(id: plan_ids).where(user_id: account_user.id)

投稿2021/06/13 13:20

編集2021/06/13 13:21
mingos

総合スコア4207

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

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

you88

2021/06/13 14:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問