LoginSignup
0
0

More than 3 years have passed since last update.

ActiveHash を使って記事に紐付けた都道府県データを元に、地方別の投稿一覧を作る

Posted at

前提

自作のアプリケーションで文化施設の情報を投稿できるものを作っていて、
投稿時に入力した都道府県のデータを元に、地方ごとで一覧表示できるようにしました。

そもそも投稿の時に地方の情報も一緒に登録するとか、
地方ごとに同じようなコードを書いているのであまりよろしくないとか改善の余地はたくさんあるとは思いますが、
とりあえず動かすことはできたという記録のために記事を作成します。

都道府県データ

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句を使って検索条件を指定する部分が自分でやってみて多少は理解できたかなというところです。
最初にも書いたように地方ごとにほぼ同様のコードを書いているので、そこは何とかシンプルにできるようにしたいです。
拙い内容とは思いますが読んでいただいてありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0