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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

Q&A

解決済

1回答

4319閲覧

【Rails5】関連テーブルを含めた検索

gogoackman3

総合スコア109

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

0グッド

0クリップ

投稿2017/03/03 14:32

###前提・実現したいこと

親テーブル:記事タイトル
子テーブル:本文(複数に分割)

親と子が1対多の関係です。

この場合に、検索をした際、

①タイトルに該当クエリが含まれる記事
②本文の中に該当クエリが含まれる記事

を抽出したいです。

①だけなら簡単なのですが、②も含める場合どうすれば良いのか分かりません。。。

###該当のソースコード

親モデル

ruby

1class Article < ApplicationRecord 2has_many :article_bodies

子モデル

ruby

1class ArticleBody < ApplicationRecord 2belongs_to :article, counter_cache: true

こんな感じでやってみましたが、Relationに問題があるとエラーが出ています。が、、、そもそもこれが正しい方向なのかもわからず。。。

ruby

1 2 @articles = Article 3 .includes(:category, :admin) 4 .joins(:article_bodies) 5 .where('UPPER(title) like :value',value: "%#{params[:q].upcase}%") 6 .or(Article.where('UPPER(article_bodies.parts) like :value',value: "%#{params[:q].upcase}%")) 7 .order(id: :DESC) 8 .page(params[:page]) 9 .per(25) 10 11 @count = Article 12 .joins(:article_bodies) 13 .where('UPPER(title) like :value',value: "%#{params[:q].upcase}%") 14 .or(Article.where('UPPER(article_bodies.parts) like :value',value: "%#{params[:q].upcase}%")) 15 .count 16

どなたか教えて頂けると幸いです・・・!

###補足情報(言語/FW/ツール等のバージョンなど)
Rails5/Mysql

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

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

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

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

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

guest

回答1

0

ベストアンサー

or の内部のArticleがarticle_bodiesとjoinされていません。

ruby

1 @articles = Article 2 .includes(:category, :admin) 3 .joins(:article_bodies) 4 .where('UPPER(title) like :value',value: "%#{params[:q].upcase}%") 5 .or(Article.joins(:article_bodies).where('UPPER(article_bodies.parts) like :value',value: "%#{params[:q].upcase}%")) 6 .order(id: :DESC) 7 .page(params[:page]) 8 .per(25) 9 10 @count = Article 11 .joins(:article_bodies) 12 .where('UPPER(title) like :value',value: "%#{params[:q].upcase}%") 13 .or(Article.joins(:article_bodies).where('UPPER(article_bodies.parts) like :value',value: "%#{params[:q].upcase}%")) 14 .count

普通こういう時はエラーメッセージも晒すべきです。

あと余談ですが、ransackという素晴らしいgemを入れると。

ruby

1_search.html.erb 2<%= search_form_for @q ,:url=>{:controller=>"articles",:action=>"index"} do |f| %> 3検索文字列 4<%= f.search_field :title_or_article_bodies_part_cont %> 5< end > 6

ruby

1articles_controller.rb 2def index 3@q = Articles.includes(:category, :admin).joins(:article_bodies).ransack(params[:q]) 4@articles = @q.result.order(id: :DESC).page(params[:page]).per(25) 5@count = @q.result.count 6~ 7end

ですみます。車輪の再発明は勉強になりますがDRY(Don't Repeat Yourself)
もrailsの理念です。gemの導入を考えてみては?

投稿2017/03/04 01:51

編集2017/03/04 01:54
moke

総合スコア2241

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

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

gogoackman3

2017/03/04 05:53 編集

ありがとうございます、なるほど、そういうことかと良くわかりました。 orを使うときは同じモデルでも再度joinさせる必要があるということですね。 一番最初に、 row_articles = Article.joins(:article_bodies ) として、 その上での、or内含めこの変数を利用するような形でも大丈夫と理解しました。 以下の記事の最下部にある事例のイメージ。 http://qiita.com/QUANON/items/0033a5adb76d0cb963cd また、gemの紹介ありがとうございます!実はもう少し複雑な検索もやる予定なのでちょっと細かく見て見ます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問