プロダクト開発日誌

技術のことなど

【Rails】モデルに都道府県情報を持たせる

今回はacrive__hashを利用して、Area Model に都道府県情報を付与します。

github.com

install

# A readonly ActiveRecord-esque base class that lets you use a hash, a Yaml file or a custom file as the datasource. Read more: https://github.com/zilkey/active_hash
gem 'active_hash'
bundle install

touch app/models/prefecture.rb

class Prefecture < ActiveHash::Base
  fields :name, :name_en
  create id: 0, name: '未設定', name_en: 'not set'
  create id: 1, name: '北海道', name_en: 'hokkaido'
  create id: 2, name: '青森県', name_en: 'aomori'
  create id: 3, name: '岩手県', name_en: 'iwate'
  create id: 4, name: '宮城県', name_en: 'miyagi'
  create id: 5, name: '秋田県', name_en: 'akita'
  create id: 6, name: '山形県', name_en: 'yamagata'
  create id: 7, name: '福島県', name_en: 'fukushima'
  create id: 8, name: '茨城県', name_en: 'ibaraki'
  create id: 9, name: '栃木県', name_en: 'tochigi'
  create id: 10, name: '群馬県', name_en: 'gumma'
  create id: 11, name: '埼玉県', name_en: 'saitama'
  create id: 12, name: '千葉県', name_en: 'chiba'
  create id: 13, name: '東京都', name_en: 'tokyo'
  create id: 14, name: '神奈川県', name_en: 'kanagawa'
  create id: 15, name: '新潟県', name_en: 'niigata'
  create id: 16, name: '富山県', name_en: 'toyama'
  create id: 17, name: '石川県', name_en: 'ishikawa'
  create id: 18, name: '福井県', name_en: 'fukui'
  create id: 19, name: '山梨県', name_en: 'yamanashi'
  create id: 20, name: '長野県', name_en: 'nagano'
  create id: 21, name: '岐阜県', name_en: 'gifu'
  create id: 22, name: '静岡県', name_en: 'shizuoka'
  create id: 23, name: '愛知県', name_en: 'aichi'
  create id: 24, name: '三重県', name_en: 'mie'
  create id: 25, name: '滋賀県', name_en: 'shiga'
  create id: 26, name: '京都府', name_en: 'kyoto'
  create id: 27, name: '大阪府', name_en: 'osaka'
  create id: 28, name: '兵庫県', name_en: 'hyogo'
  create id: 29, name: '奈良県', name_en: 'nara'
  create id: 30, name: '和歌山県', name_en: 'wakayama'
  create id: 31, name: '鳥取県', name_en: 'tottori'
  create id: 32, name: '島根県', name_en: 'shimane'
  create id: 33, name: '岡山県', name_en: 'okayama'
  create id: 34, name: '広島県', name_en: 'hiroshima'
  create id: 35, name: '山口県', name_en: 'yamaguchi'
  create id: 36, name: '徳島県', name_en: 'tokushima'
  create id: 37, name: '香川県', name_en: 'kagawa'
  create id: 38, name: '愛媛県', name_en: 'ehime'
  create id: 39, name: '高知県', name_en: 'kochi'
  create id: 40, name: '福岡県', name_en: 'fukuoka'
  create id: 41, name: '佐賀県', name_en: 'saga'
  create id: 42, name: '長崎県', name_en: 'nagasaki'
  create id: 43, name: '熊本県', name_en: 'kumamoto'
  create id: 44, name: '大分県', name_en: 'oita'
  create id: 45, name: '宮崎県', name_en: 'miyazaki'
  create id: 46, name: '鹿児島県', name_en: 'kagoshima'
  create id: 47, name: '沖縄県', name_en: 'okinawa'
end

都道府県データ参考: http://www.kokudo.or.jp/master/001.html

エリアに都道府県を持たせる

エリアにカラムを追加

bundle exec rails generate migration AddPrefectureIdToAreas prefecture_id:string
bundle exec rails db:migrate

ストロングパラメーターに追加

app/controllers/areas_controller.rb

# Never trust parameters from the scary internet, only allow the white list through.
def area_params
  params.require(:area).permit(:name, :description, :prefecture_id)
end

エリアは都道府県に属する

app/models/area.rb

class Area < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :prefecture
end

View

app/views/areas/_form.html.slim

.field
  = f.label :prefecture_id
  = f.collection_select :prefecture_id, Prefecture.all, :id, :name

app/views/areas/show.html.slim

p
  strong Prefecture:
  = @area.prefecture.name