都道府県データを扱う方法は色々あるかと思いますが、本記事ではhas_many – belongs_toのリレーションで、Userが都道府県データを持てるように実装したいと思います。ちなみにgemライブラリで実装する場合はgem ‘jp_prefecture’があります。
マイグレーション
まずは、都道府県名を入れる、Prefectureモデルを作ります。
1 |
$ rails g model Prefecture name:string |
db/migrate/20xxxxx_create_prefectures.rb
1 2 3 4 5 6 7 8 9 |
class CreatePrefectures < ActiveRecord::Migration[5.2] def change create_table :prefectures do |t| t.string :name t.timestamps end end end |
Userがprefecture_idを持てるようにreferencesを追加します。
1 |
$ rails g migration AddPrefectureRefToUsers prefecture:references |
db/migrate/20xxxxxx_add_prefecture_ref_to_users.rb
1 2 3 4 5 |
class AddPrefectureRefToUsers < ActiveRecord::Migration[5.2] def change add_reference :users, :prefecture, foreign_key: true end end |
$ rails db:migrateします。
リレーション
app/models/prefecture.rb
1 2 3 |
class Prefecture < ApplicationRecord has_many :users end |
app/models/user.rb
1 2 3 |
class User < ApplicationRecord belongs_to :prefecture, optional: true end |
seedデータ
seedデータの編集が簡単なseed-fuを使ってseedデータをいれていきます。
1 |
gem 'seed-fu' |
db/fixtures/prefecture.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Prefecture.seed(:id, { :id => 0, :name => "北海道" }, { :id => 1, :name => "青森県" }, { :id => 2, :name => "岩手県" }, { :id => 3, :name => "宮城県" }, { :id => 4, :name => "秋田県" }, { :id => 5, :name => "山形県" }, { :id => 6, :name => "福島県" }, { :id => 7, :name => "茨城県" }, { :id => 8, :name => "栃木県" }, { :id => 9, :name => "群馬県" }, { :id => 10, :name => "埼玉県" }, { :id => 11, :name => "千葉県" }, { :id => 12, :name => "東京都" }, { :id => 13, :name => "神奈川県" }, { :id => 14, :name => "新潟県" }, { :id => 15, :name => "富山県" }, { :id => 16, :name => "石川県" }, { :id => 17, :name => "福井県" }, { :id => 18, :name => "山梨県" }, { :id => 19, :name => "長野県" }, { :id => 20, :name => "岐阜県" }, { :id => 21, :name => "静岡県" }, { :id => 22, :name => "愛知県" }, { :id => 23, :name => "三重県" }, { :id => 24, :name => "滋賀県" }, { :id => 25, :name => "京都府" }, { :id => 26, :name => "大阪府" }, { :id => 27, :name => "兵庫県" }, { :id => 28, :name => "奈良県" }, { :id => 29, :name => "和歌山県" }, { :id => 30, :name => "鳥取県" }, { :id => 31, :name => "島根県" }, { :id => 32, :name => "岡山県" }, { :id => 33, :name => "広島県" }, { :id => 34, :name => "山口県" }, { :id => 35, :name => "徳島県" }, { :id => 36, :name => "香川県" }, { :id => 37, :name => "愛媛県" }, { :id => 38, :name => "高知県" }, { :id => 39, :name => "福岡県" }, { :id => 40, :name => "佐賀県" }, { :id => 41, :name => "長崎県" }, { :id => 42, :name => "熊本県" }, { :id => 43, :name => "大分県" }, { :id => 44, :name => "宮崎県" }, { :id => 45, :name => "鹿児島県" }, { :id => 46, :name => "沖縄県" } ) |
$ rails db:seed_fuを実行します。
コントローラー
create/updateできるように、ユーザーのストロングパラメータに:prefecture_idを追加します。
app/controllers/users_controller.rb
1 2 3 4 5 6 7 |
class UsersController < ApplicationController private def user_params params.require(:user).permit(:name, :prefecture_id) end end |
ビュー
form内はcollection_selectでプルダウンメニューにします。
app/views/users/_form.html.erb
1 |
<%= f.collection_select :prefecture_id, Prefecture.all, :id, :name, include_blank: '選択して下さい' %> |
app/views/users/show.html.erb
1 |
<%= @user.prefecture.name if @user.prefecture_id? %> |
カウント数を取得
一つのPrefectureが持っているUser数を取得するには、countメソッドを使います。
1 2 3 4 5 |
$ rails c > p = Prefecture.find(22) > p.users.count (0.5ms) SELECT COUNT(*) FROM "users" WHERE "users"."prefecture_id" = $1 [["prefecture_id", 22]] => 2 |
以上です!ご覧いただき、ありがとうございました!!😄