回答編集履歴

2 K

moke

moke score 2199

2017/03/06 14:51  投稿

緯度と経度をベースに検索することがない限り。
店舗モデルに、都道府県(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
shops_controller.rb
def index
@q=Shop.search(params[:q])
@shops=@q.result
~
end
```
として
サーチフォームなら
```ruby
_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 %>
serach
<%end%>
```
リンクなら
```ruby
<%= link_to '東京都',{:controller=>"shops",:action=>"index",:q=>{:place_prefecture_cont=>URI.escape('東京都')}%>
```
みたいな感じにすればいいと思います。
URI.escapeはなくてもいいかもしれませんが念のため
controllerの一番上に
require 'uri'
と追記してください
参考になれば。
1 変更

moke

moke score 2199

2017/03/06 14:47  投稿

緯度と経度をベースに検索することがない限り。
店舗モデルに、都道府県(perfecture_id)を用意して47個のidを紐づけるだけでいいと思います。
もしくはcity_idやtown_id、何れにせよ、絞り込みを行いたい一番細かい範囲のidを一つひもづければ
十分だと思います。検索は(都道府県・地方・地域)テーブル経由で十分ですし。
しかし、重要なのは入力フォームです。
住所は誰が入力するのでしょう?
ユーザー? お店側? それとも管理者ですか?
人間は間違える生き物です。
都道府県を入力しなかったり、字が間違っていたり。
入力のブレも存在します。
ユーザーなら、携帯のGPSから住所を取得したり、したいですし。
お店側なら、最低でも郵便番号から、住所が入るようにしたほうがいいと思います。
どうも管理者が入力するようなので具体的なコードを書くと
まず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
shops_controller.rb
def index
@q=Shop.search(params[:q])
@shops=@q.result
~
end
```
として
サーチフォームなら
```ruby
_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 %>
serach
```
リンクなら
```ruby
<%= link_to '東京都',{:controller=>"shops",:action=>"index",:q=>{:place_prefecture_cont=>URI.escape('東京都')}%>
```
みたいな感じにすればいいと思います。
URI.escapeはなくてもいいかもしれませんが念のため
controllerの一番上に
require 'uri'
と追記してください
参考になれば。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る