質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

7651閲覧

Ruby on Railsで都道府県とエリア分けする場合の設計

sara

総合スコア11

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/03/04 17:28

###何をしたいか
Railsの検索画面で都道府県一覧があって、リンクを押すと一覧(ex. 東京都のリンクを押したら東京都のお店一覧が検索結果に表示される)がでる機能を実装したいと思ってます。食べログやhomesみたいな感じです。地方・都道府県で絞れるみたいな。

###現在のMVC
シンプルに店舗モデルにadress(住所)のカラムを持ってるだけです。

###つまっているところ
そもそも根本的にどういう設計をすればいいのかがわからないです。
なんとなく都道府県・地方・地域などのModel/controller/routeを作成してアソシエーションを使うのはわかるのですが、参考にできるソースなどが見当たらなかったので質問させていただきました。

###答え求む!
Railsエンジニアの方々で、過去に都道府県や地域から絞込の機能を実装した時はどのような設計でコードを書きましたか?

サンプルコードなどを用いて説明していただくと大変助かります!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

緯度と経度をベースに検索することがない限り。
店舗モデルに、都道府県(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)

idregionperfecturecity
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 01:07

編集2017/03/06 05:51
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sara

2017/03/06 05:03

店舗の住所は管理者が入力してます。geocoderを使って緯度・経度は自動で取得しています。 店舗DBは以下 ・adressカラム ・緯度カラム ・経度カラム みたいな感じになってます。 prefecture_idを店舗DBに持たせればいいのはなんとなくわかりますが、prefectureモデルとコントローラーから作らなければならないのでしょうか? そして47都道府県をトップページに載せて、それぞれの都道府県ごとのお店一覧を実装したいです。 ほんとうに初心者なので、まだrailsの形が掴めない状態なので、実際にコードとか参考に見せて頂くと大変助かります。。
sara

2017/03/06 15:07

たびたびすみません。。 もし正規方法で実装する場合はどうすればよいのでしょうか? prefecture.rb has_many: shops; ・name(都道府県) shop.rb belongs_to: prefecture; ・prefecture_id(外部キー) 上記であってますか? そしてransackで検索機能を実装しているのですが、都道府県はprefectureモデルに持っているのに、shop.html.erbで検索できるのでしょうか? よくサイトにあるselectbox(都道府県選択)みたいな感じにしたいのですが。。 あとそもそも都道府県はどこで登録すればよいのでしょうか? seedデータですか? もう本当に初心者なので基本的なことがわからなくてすみません。。
moke

2017/03/07 00:32

上記であってますか?→あってます 都道府県等は変更がないので定数で持つのがいいと思います。 PREFECTURES={1=>'北海道',2=>'青森',…} よくサイトにあるselectbox(都道府県選択)みたいな感じにしたいのですが。。 経験上これはすごく使いにくいのでオススメしませんが サーチフォーム内に <%= f.select :prefecture_id_eq, PREFECTURES %> みたいな感じでしょうか?
tacsheaven

2017/03/07 00:39

都道府県を定数化するなら、 JIS X0401 で規定されている都道府県コードを使うのが良いでしょう。なんだかんだいっていろんなところで使われているコードですから、だいたい他と同じ順番に並びます。
sara

2017/03/09 13:23

結局addressカラムをshopモデルに持たせて、ransackで検索することにしました。 mokeさんtacsheavenさんわざわざご回答いただいたのに申し訳ないです。。 しかしお二方のおかげでRailsに対する設計やコードを学ぶことができました! ありがとうございました!
moke

2017/03/09 14:23 編集

いえいえ なんだかんだ言ってそれが単純でいいと思いますよ。 頑張って下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問