前提
自作のアプリケーションで文化施設の情報を投稿できるものを作っていて、
投稿時に入力した都道府県のデータを元に、地方ごとで一覧表示できるようにしました。
そもそも投稿の時に地方の情報も一緒に登録するとか、
地方ごとに同じようなコードを書いているのであまりよろしくないとか改善の余地はたくさんあるとは思いますが、
とりあえず動かすことはできたという記録のために記事を作成します。
都道府県データ
prefecture.rb
class Prefecture < ActiveHash::Base
self.data = [
{ 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: '宮崎県' }, { id: 47, name: '鹿児島県' }, { id: 48, name: '沖縄県' }
]
include ActiveHash::Associations
has_many :posts
end
ActiveHash については割愛しますが、上のように都道府県ごとにid で投稿に紐付けられるようにしています。
ルーティング
routes.rb
Rails.application.routes.draw do
devise_for :users
root to: "posts#index"
resources :posts do
collection do
get 'search'
get 'search_kanto'
end
end
end
モデル
post.rb
class Post < ApplicationRecord
belongs_to :user
has_one_attached :image
has_many :favorites, dependent: :destroy
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :prefecture
# 〜省略〜
def self.search_kanto
Post.where(prefecture_id: 9..15)
end
end
where句で指定の都道府県が登録されている投稿を取得しています。
コントローラー
posts_controller.rb
class PostsController < ApplicationController
# 〜省略〜
def search_kanto
@posts_kanto = Post.search_kanto.order('created_at DESC')
end
end
@posts_kantoに取得した投稿を代入して、ビューファイルで表示できるようにしています。
学んだこと
where句を使って検索条件を指定する部分が自分でやってみて多少は理解できたかなというところです。
最初にも書いたように地方ごとにほぼ同様のコードを書いているので、そこは何とかシンプルにできるようにしたいです。
拙い内容とは思いますが読んでいただいてありがとうございます。