君が代

基本的にワイの忘備録(コードとかで誤りやもっと良い方法があるぞというのはコメントしてくれたらうれC)

【Rails忘備録】店舗一覧機能(外部キー追加によるReferences型の使用)を作成するの巻

今回は店舗一覧機能ついてまとめる。

手順

まずStoreのモデルを作成する。 UserをStoreの外部キーとして設定する場合、以下のようにして外部キーを加えることができるようになります。

$ rails g model Store ... user:references

create_stores.rb

class CreateStores < ActiveRecord::Migration[5.2]
  def change
    create_table :stores do |t|
      t.string :name, null: false
      t.string :address, null: false
      t.text :business_hours, null: false
      t.string :regular_holiday, null: false
      t.text :description
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end

店舗情報については管理ユーザーのみが編集できるため、ユーザーと店舗情報の関係は1対多となる。 その場合の紐付けは下記のように設定する。

user.rb

has_many :stores, dependent: :destroy

store.rb

belongs_to user

上記のアソシエーションを定義すればStoreモデルのレコード(=@store)から、紐づくユーザーモデルのレコード(=@user)を取得したい場合に、記述を簡素化することができます。

# アソシエーション無し
@user = User.find(@store.user_id)
---------------------------------------------
# アソシエーションあり
@user = @store.user

viewに関しては下記のようになります。

index.thml.slim

.container.pt-3
  .row
    .col-lg-10.offset-lg-1
      form
        .input-group.mb-3
          input.form-control[placeholder="検索ワード" type="search"]
          .input-group-append
            input.btn.btn-primary[type="submit" value="検索"]
  .row
    .col-12
      .row
        - if @stores.present?
          = render @stores
        - else
          p
            = t('.no_result')

_store.html.slim

.col-sm-12.col-lg-4.mb-3
  .card
    = image_tag store.image_url,  class: 'card-img-top', size: '300x200'
    .card-body
      h4.card-title
        = link_to store.name, store_path(store.id)
      .mr10.float-right
        a[href="#"]
          = icon 'fas', 'trash', class: 'pr-1'
        a[href="#"]
          = icon 'fa', 'pen'
      p.card-text
        = store.description