【rails】 ransackを使わずに複数モデルから値を取得する!!
こんにちは白ヒゲさんです(*´∇`*)
今回は前回で作成したtag編集機能の続きになります。
<検索機能の実装>
折角、tagを付けたり編集できたりできるようになりました。
tagを付けたと言うことはもちろん検索ができるようにするためですよね??
なので検索機能を実装していきたいと思いますd(^_^o)
<今回の検索対象と実装内容>
・検索対象はブログ記事のtitleとそれに付随するタグのtag_nameです。
・ブログ記事はBlogモデル。tag_nameはTagモデルと別々のモデルとなります。
・この検索をselectboxなどを使用せずに同一のtext_field内で完結させます。
・今回は投稿者は対象外ですが実装は似たような感じで行けると考えます。
それではやっていきましょう!!
検索内容の記述はblogコントローラーとモデルへ記述しています。
<blogs_controller>
ここではsearchで検索してきて@blogs配列がnil出なければ配列を展開していきます。
(viewの記述は省略します)
そして@blogs配列がnilだと何も表示されないように条件分岐しています。
<blog_model>
コントローラーで記述していたsearchの中身をモデル内に記述していきます。
確か記述の理由が、データのやりとりをするのがモデルだからなのとコントローラーの可読性を上げるためです(違ったら教えてください😃)
それでは、中身の説明をしていきます!
・@tagと@blogは検索内容がヒットしたらそれぞれのモデルから当てはまるものを持ってきます。
・@blogの分はブログ記事を展開するところでそのまま使用できるので良いんですが、
@tagは変換して付随しているblog_idを持ってくることにしました。(ここも他に良い方法があれば教えてきただきたいです)
・それが<if @tag.present?>による条件分岐です。
<blogtags = BlogTag.where(tag_id: @tag.ids)>
・まずはblogとtagテーブルを結ぶ中間テーブルblogtagから@tag_idsと紐づいているblogtagを抽出します。
<blogtag = blogtags.pluck(:blog_id)>
・pluckでblogtags配列からblog_idを抽出します。
<blog = Blog.were(id: blogtag)>
・この時blogtagはidのみなのでBlogモデルから同じidのものを検索してきます。
これで@tagが付随するblog記事を抽出することに成功しました(*´∇`*)
後は<@blog += blog>で@blogへ挿入してあげると完成です。
コードにすると凄く短いですが条件などを捻り出すのにかなり時間がかかりました_:(´ཀ`」 ∠):
ですが、検索機能自体は絶対に必要だとは思うので有意義だったと思います!
今後は可読性を上げていかねば思いますd(^_^o)
もし誰かのヒントになれば幸いです。
それでは、今回も最後までありがとうございました⭐︎