質問: ### 何をしたいか Railsの検索画面で都道府県一覧があって、リンクを押すと一覧(ex. 東京都のリンクを押したら東京都のお店一覧が検索結果に表示される)がでる機能を実装したいと思ってます。食べログやhomesみたいな感じです。地方・都道府県で絞れるみたいな。 ### 現在のMVC シンプルに店舗モデルにadress(住所)のカラムを持ってるだけです。 ### つまっているところ そもそも根本的にどういう設計をすればいいのかがわからないです。 なんとなく都道府県・地方・地域などのModel/controller/routeを作成してアソシエーションを使うのはわかるのですが、参考にできるソースなどが見当たらなかったので質問させていただきました。 ### 答え求む! Railsエンジニアの方々で、過去に都道府県や地域から絞込の機能を実装した時はどのような設計でコードを書きましたか? サンプルコードなどを用いて説明していただくと大変助かります!
回答: 緯度と経度をベースに検索することがない限り。 店舗モデルに、都道府県(perfecture_id)を用意して47個のidを紐づけるだけでいいと思います。 もしくはcity_idやtown_id、何れにせよ、絞り込みを行いたい一番細かい範囲のidを一つひもづければ 十分だと思います。検索は(都道府県・地方・地域)テーブル経由で十分ですし。 しかし、重要なのは入力フォームです。 住所は誰が入力するのでしょう? ユーザー? お店側? それとも管理者ですか? 人間は間違える生き物です。 都道府県を入力しなかったり、字が間違っていたり。 入力のブレも存在します。 どうも管理者が入力するようなので具体的なコードを書くと まずransackというgemを導入します。 地方(region)・都道府県(perfecture)・地域(city) こんな感じでしょうかcityは六本木エリアとか漠然としたものを想像しています。 で、教科書通りならregion modelとperfecture modelとcity modelを作るのですが。 cityをどんだけ細かくするかにもよりますが、検索時のjoinのコストを考えると、下手な正規化を行わず。 tableは places id,region:string,perfecture:string,city:string) | id | region | perfecture | city | | --- | --- | --- | --- | | 1 | 関東 | 東京都 | 六本木 | | 2 | 関東 | 東京都 | 新宿 | で十分かと思います。 place has_many: :shops shop belongs_to: place みたいにしてplace_idをshopにもたせて ``` shops_controller.rb def index @q=Shop.search(params[:q]) @shops=@q.result ~ end ``` として サーチフォームなら ``` _serach.html.erb <%= search_form_for @q ,:url=>{:controller=>"shops",:action=>"index"} do |f| %> <%= f.search_field :place_region_cont %> <%= f.search_field :place_prefecture_cont %> <%= f.search_field :place_city_cont %> <%end%> ``` リンクなら ``` <%= link_to '東京都',{:controller=>"shops",:action=>"index",:q=>{:place_prefecture_cont=>URI.escape('東京都')}%> ``` みたいな感じにすればいいと思います。 URI.escapeはなくてもいいかもしれませんが念のため controllerの一番上に require 'uri' と追記してください 参考になれば。