緯度と経度をベースに検索することがない限り。
店舗モデルに、都道府県(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にもたせて
ruby
1shops_controller.rb
2def index
3@q=Shop.search(params[:q])
4@shops=@q.result
5~
6end
として
サーチフォームなら
ruby
1_serach.html.erb
2<%= search_form_for @q ,:url=>{:controller=>"shops",:action=>"index"} do |f| %>
3<%= f.search_field :place_region_cont %>
4<%= f.search_field :place_prefecture_cont %>
5<%= f.search_field :place_city_cont %>
6<%end%>
リンクなら
ruby
1<%= link_to '東京都',{:controller=>"shops",:action=>"index",:q=>{:place_prefecture_cont=>URI.escape('東京都')}%>
みたいな感じにすればいいと思います。
URI.escapeはなくてもいいかもしれませんが念のため
controllerの一番上に
require 'uri'
と追記してください
参考になれば。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/06 05:03
2017/03/06 15:07
2017/03/07 00:32
2017/03/07 00:39
2017/03/09 13:23
2017/03/09 14:23 編集