🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails 6

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

Q&A

解決済

1回答

792閲覧

ページネーションができない

taba.3011

総合スコア12

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/01/28 16:12

######前提・実現したいこと
rails6.0.3.4でkaminariを使用してページネーションしているのですが、複数単語検索によるページネーションができないです。画面に全結果が表示され、降順も反映されません。ページの一番下にはページ遷移ボタンがあるのですが、遷移先は遷移前の画面がそのまま表示されてしまいます。
######controller

def search redirect_to root_path if params[:keyword] == "" split_keyword = params[:keyword].split(/[[:blank:]]+/) @articles = [] split_keyword.each do |keyword| next if keyword == "" @articles += Article.joins(:tags).where('title LIKE(?) OR content LIKE(?) OR tags.name LIKE(?)', "%#{keyword}%", "%#{keyword}%", "%#{keyword}%") end @articles.uniq! @articles = Article.page(params[:page]).order("created_at DESC") end

#####search.html.erb

<div class="contents row"> <%= render partial: "shared/articles", locals: { article: @articles } %> <%= paginate @search_resoult %> </div>

######試したこと
当初は1単語検索をしており、モデルに処理を記述し、コントローラーで@articles = Article.search(params[:keyword]).page(params[:page]).order("created_at DESC")
とすることでページネーションをしていました。

ただ、複数単語検索をやろうとした時に理解が及ばず、モデルとコントローラーの繋がりがわからなくなってしまったので、コントローラーに記述し直しました。そのため、
@articles = Article.page(params[:page]).order("created_at DESC")
という記述でページネーションを試みたのですが、うまくいきません。

自分ではArticle.〇〇で指定するのではと思っているのですが、findやwhereを使ってみたのですがうまくいかず、どこの何を指定すればいいのかが全くわからなくなってしまった状態です。

かなりサイトで調べたりしたのですが、同じ境遇でのページネーションが中々見つからず困っています。
どなたか詳しい方がいらっしゃったら教えていただきたいです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1@articles = Artcles.where(...).or(Artcles.where(...)).or(Artcles.where(...)).or(Artcles.where(...)) 2@articles = @articles.page(...).order(...)

上記のようなクエリを用意できれば良さそうです。

ruby

1@articles = Article.joins(:tags) 2 3keywords = params[:keyword].split(/[[:blank:]]+/) 4# キーワードの数だけ Article.where(...) の部分を作ってます 5keywords = keywords.map do |keyword| 6 @articles.where("title LIKE(:keyword) OR content LIKE(:keyword) OR tags.name LIKE(:keyword)", keyword: keyword) 7end 8 9# キーワードの最初のひとつは or ではなく、merge を用います 10@articles = @articles.merge(keywords[0]) 11# 残りのキーワードを or で追加していきます 12keywords[1, keywords.length].each do |keyword| 13 @articles = @articles.or(keyword) 14end 15 16@articles = @articles.page(params[:page]).order("created_at DESC")

もしくは、

SQL

1title LIKE(keyword1) OR content LIKE(keyword1) OR tags.name LIKE(keyword1) OR 2title LIKE(keyword2) OR content LIKE(keyword2) OR tags.name LIKE(keyword2) OR 3title LIKE(keyword3) OR content LIKE(keyword3) OR tags.name LIKE(keyword3)

という文字列を用意すれば良いので、Array#inject などで組み立てていく方法もあります。
こちらの方法はインジェクションに注意する必要があります。

投稿2021/01/29 03:19

neko_daisuki

総合スコア2090

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

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

taba.3011

2021/01/29 08:46

neko_daisuki様回答ありがとうございます!ものすごく綺麗なコードで感嘆しました!説明もわかりやすかったです。 こちらのコードを参考にさせていただいたところ、うまくページネーションできました。 複数検索になると結構複雑なことをするのですね... 今の自分だと、検索のみでこの答えに行き着くことは難しかったと思います。 丸一日考えても上手くいかず、諦めようかと思っていました。 すごく助かりました!本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問