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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

2回答

1603閲覧

Railsで任意のModelをつなげるには

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/01/27 12:55

ModelとしてPost(投稿)、Comment(コメント)があったとします。

複数のPostのコメントだけを抽出したい時はどのようにすれば良いでしょうか?

A~ZのPostがあり、このうちのA,H,Jだけのコメント一覧を取得したいです。

postsにはA,H,Jが入っているとします

comments = [] posts.each do |post| comments.push(post.comment) end

とすれば、commentsにA,H,Jだけのコメントは集められると思います。ですが、この集まったコメントかwhere等で検索をかけたい時、active recordではないので検索することができません。

仮にcommetns = []ではなくて comments = 空のコメントの集合、であれば問題なくwhereで検索をかけることができると思います。

上記の「空のコメントの集合」という表しかたが分かりませんでした。また異なる良い手法があれば教えていただきたいです。

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

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

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

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

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

guest

回答2

0

仮にcommetns = []ではなくて comments = 空のコメントの集合、であれば問題なくwhereで検索をかけることができると思います。

.whereでの絞り込みは、あくまでデータベースに対して行うものですので、Railsの側で勝手に作った集合に対して行うことはできません。

この場合は、使い方を工夫すれば、目的のコメントをDBから引くことができます(いちおうですが、バックエンドはRDBMS、という前提です)。

ruby

1# まずはIDだけ抽出 2post_ids = posts.map(&:id) 3 4# コメントを抽出 5related_comments = Comment.where(post_id: post_ids) 6 7# さらなる絞り込み 8refined = related_comments.where(...)

投稿2017/01/27 13:03

maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2017/01/27 13:11

度々のご回答ありがとうございます! 感動しました....。 ありがとうございました。
guest

0

以下では、 Idea と Comment のモデルでためしています。

app/modes/comment.rb を次の様に記載します。

ruby

1... 2 belongs_to :idea 3 4 scope :select_by_ideas, -> (ideas) { 5 where(idea_id: ideas.pluck(:id)) 6 } 7 8 scope :select_by_idea_array, -> (idea_array) { 9 where(idea_id: idea_array.map(&:id)) 10 } 11...

こうすると
Comment.select_by_ideas(Comment.limit(1))

Comment.select_by_ideas([cooment0, comment1])
のようにして、idea を指定して、それに紐ついているコメントを取得できます。
取得結果にさらに ActiveRecord のメソッドを適用することもできます。

rails console で試してみます。(table は事前に db:seed で投入済です)

ruby

1$ bundle exec rails c 2 3> Idea.select([:id, :name]) 4 Idea Load (0.1ms) SELECT id, name FROM "ideas" 5=> [#<Idea id: 980190962, name: "IDEA_001">, #<Idea id: 102, name: "IDEA_002">] 6 7> Comment.select([:id, :idea_id]) 8 Comment Load (0.1ms) SELECT id, idea_id FROM "comments" 9=> [#<Comment id: 200, idea_id: 102>, #<Comment id: 428300069, idea_id: 980190962>, #<Comment id: 554292058, idea_id: 980190962>] 10 11> Comment.select_by_ideas(Idea.limit(3)).select([:id, :idea_id]).limit(4) 12 (0.1ms) SELECT "ideas"."id" FROM "ideas" LIMIT 3 13 Comment Load (0.2ms) SELECT id, idea_id FROM "comments" WHERE "comments"."idea_id" IN (980190962, 102) LIMIT 4 14=> [#<Comment id: 200, idea_id: 102>, #<Comment id: 428300069, idea_id: 980190962>, #<Comment id: 554292058, idea_id: 980190962>] 15 16> idea0 = Idea.all[0] 17> idea1 = Idea.all[1] 18> Comment.select_by_idea_array([idea0, idea1]).select([:id, :idea_id]).limit(4) 19 Comment Load (0.2ms) SELECT id, idea_id FROM "comments" WHERE "comments"."idea_id" IN (102, 980190962) LIMIT 4 20=> [#<Comment id: 200, idea_id: 102>, #<Comment id: 428300069, idea_id: 980190962>, #<Comment id: 554292058, idea_id: 980190962>] 21

投稿2017/01/28 01:58

katoy

総合スコア22324

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

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

katoy

2017/01/28 01:59

空のコメントの集合 は Comment.none() で表現することができます。
退会済みユーザー

退会済みユーザー

2017/01/29 17:01

ご回答ありがとうございます! 説明の部分にComment.select_by_ideas(Comment.limit(1))という箇所がありますが、Comment.limit(1)ではなくてIdea.limit(1)でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問