■
Nameモデル
・nameカラム
・ageカラム
・hobbyカラム
Postモデル
・name_idカラム
・contentカラム
■
「userはたくさんのpostを持つ」ということで、
has_manyとbelongs_toで関連付けを行っています。
■キーワード検索「山田 サッカー」でヒットさせたい。(データは既に追加済みです。)
ビューのフォームのname属性は、メイン部分の抜粋ですが以下のようにしています。
<%= f.search_field :name_or_age_or_hobby_or_posts_content_cont_all %>
(ageカラムの数値検索に関してArel.sqlとCASTで解決しています。)
■kaminariを利用しています。
■スペースで区切った複数ワード検索についてですが、splitとjoinを使って解決しています。
■上記のようですと、
@q = Name.includes(:posts).ransack(params[:q])
@names = @q.result(distinct: true).page(params[:page])
で検索を行ったときに、カラムごとに「山田」と「サッカー」を探しに行くので、もちろんヒットしません。
■やりたいことは、nameカラムで「山田」がヒットし、hobbyカラムで「サッカー」がヒットさせたいです。
■ransackerやカラム結合検索したのですが、いまも解決できていません。
なにかヒントでもおかしい点でもありましたら、ご連絡ください。
宜しくお願い致します。
【コードを追記致しました】
scaffoldでnameとpostを作成いたしました。
rails g scaffold name name:string age:integer hobby:string
rails g scaffold post content:text
下記、お答えいただく前のコードです。
■nameビューのindex.html.erb
検索フォームと結果表示
Ruby
1<%= search_form_for @q do |f| %> 2 <%= f.label :name_or_age_or_hobby_or_posts_content_cont_any, "検索" %> 3 <%= f.search_field :name_or_age_or_hobby_or_posts_content_cont_any %> 4<%= f.submit "Search" %> 5<% end %> 6#thead省略 7<tbody> 8 <% @names.each do |name| %> 9 <tr> 10 <td><%= name.name %></td> 11 <td><%= name.age %></td> 12 <td><%= name.hobby %></td> 13 <td><%= link_to 'Show', name %></td> 14 <td><%= link_to 'Edit', edit_name_path(name) %></td> 15 <td><%= link_to 'Destroy', name, method: :delete, data: { confirm: 'Are you sure?' } %></td> 16 </tr> 17 <% end %> 18</tbody>
■モデルname.rb
Ruby
1class Name < ApplicationRecord 2 has_many :posts 3 4 private 5 ransacker :age do 6 Arel.sql("CAST(names.age AS CHAR(8))") 7 end 8end
■モデルpost.rb
Ruby
1class Post < ApplicationRecord 2 belongs_to :name 3end
■nameコントローラーindexアクション
Ruby
1def index 2 if params[:q] == nil #読み込み時処理 3 @q = Name.includes(:posts).ransack(params[:q]) 4 @names = @q.result(distinct: true).page(params[:page]) 5 else #検索時の処理 6 params[:q][:name_or_age_or_hobby_or_posts_content_cont_any] = params[:q][:name_or_age_or_hobby_or_posts_content_cont_any].split(/[[:space:]]/) 7 #ransack検索 8 @q = Name.includes(:posts).ransack(params[:q]) 9 @names = @q.result(distinct: true).page(params[:page]) 10 #splitした配列をjoin 11 params[:q][:name_or_age_or_hobby_or_posts_content_cont_any] = params[:q][:name_or_age_or_hobby_or_posts_content_cont_any].join(' '); 12 end 13end
お答えいただきましたコードを自分なりに、想定されるところに挿入してみたのですが、
良い結果が得られず、頓挫してしまいました。
お答えいただきましたコードを利用する場合、splitやjoinにも工夫がやはり必要になりますか?
大変恐縮でございますが、宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/16 08:28
2018/11/16 09:08 編集
2018/11/19 02:43
2018/12/01 12:37