Ruby on Railsでカテゴリーを関連付ける方法

RubyonRailsでカテゴリーを関連付ける方法

Railsやってて、カテゴリーってどうやって関連付けるんだろう?そう思ったことはないだろうか?

今この記事を見ているのなら、カテゴリーとPostとかShopとかVideoとの関連付けに困っているはず。

なので、Railsでカテゴリーを関連付けする方法を解説します。

どうも!15年ほど現役ITエンジニアをしているよこやま良平です。
その観点からわかりやすく解説します。

【無料プレゼント】
WordPress緊急チェック50

「自分のサイトは今、安全なのか?」
自信を持って答えられますか?

WordPress緊急チェック50

こんなお悩みはありませんか?

  • ある朝、サイトを開いたら真っ白画面になっていた
  • 管理画面にログインできなくなって手が止まった
  • 身に覚えのない記事やページが勝手に増えていた
  • プラグインを更新したらサイト全体が崩れてしまった
  • 以前バックアップを取ったか自分でも覚えていない

累計1,000件以上のWordPressトラブル対応の経験から、「壊れる前に備える」ためのチェックリストを1冊にまとめました。
ログイン・本体・バックアップ・サーバー・運用の5分野を、50項目で「危険度・確認方法・対処法」まで解説しています。

セキュリティプラグイン・WordPressの教科書も含めた3大特典を、
今なら無料で受け取れます。

今すぐ無料ダウンロードする →

※登録後すぐにメールで特典をお届けします

1 RailsでScaffoldでベースを作成

まずは元になる、ShopとかPostとかをScaffoldします。

$ rails g scaffold post title:string content:text category_id:integer
$ rails db:migrate

これでベースとなる入力フォームができます。

2 RailsでCategoryを作成する

次はRailsのコマンドで同じくカテゴリーのベースをScaffoldで作成します。

$ rails g scaffold category name:string
$ rails db:migrate

これでカテゴリー入力フィールドが出来ました。

3 PostとCategoryをModelsで関連付ける

こっから困っている部分になってますね?

関連付ける場所は2かしょです。

class Category < ApplicationRecord
  has_many :posts
end
class Post< ApplicationRecord
  belongs_to :category
end
has_many :posts
belongs_to :category

この2つを使って関連付けを行います。重要な部分です。

4 Railsで関連付けしたカテゴリーを投稿時に選択できるようにする

<div class="field">
  <%= form.select :category_id, Category.all.map{|o| [o.name, o.id]} %>
</div>

こう書くことで、Categoryの元々ある番号とPostsで作ったCategory_idを関連付けできます。

関連づけると、数字での選択ではなくCategoryで作成した名前で選択できるようになります。

  • メンズ
  • インナー
  • ジャケット
  • パンツ

などの名前で選択できるようになります。

5 Viewsへも追加してRailsで関連付けたカテゴリーを表示できるようにする

<%= post.category.name %>

これをindex.html.erb ファイルに追加する。
こちらは

<% @posts.each do |post| %>
~中略~
この間に入れる
~中略~
<% end %>

続いて

<%= @post.category.name %>

show.html.erb内ならどこに置いても動く。

Railsのカテゴリー関連付け成功例
Railsのカテゴリー関連付け成功例

応用編 制作途中でカテゴリーを追加したくなったら

$ rails g migration AddCategory_idToPosts category_id:integer
$ rails db:migrate

これで追加できるので、次の記述も忘れずに

 def post_params
    params.require(:post).permit(:title, :content, :category_id )
 end
:category_id

この追加した部分を忘れないように追記すること。

これを忘れると、投稿時や編集時にカテゴリーを保存出来なくなる

番外編 エラー:Category translation missing: ja.activerecord.errors.models.post.attributes.category.required が出たら

Category translation missing: ja.activerecord.errors.models.video.attributes.category.required

こんなエラーが出たら、これはエラー文章がうまく日本語化できてない証拠。

ja:
  activerecord:
    errors:
      models:
        video:
          attributes:
            category:
              required: カテゴリー選択必須

このように追加してやると解決する。

人によって

  • ja.yml

これが devise.views.ja.yml になっている場合もある

この devise はログイン制御する実装を行うと一番始めに使うGemなので使っていたらわかる。

この記事を書いた人

よこやま良平

こんにちは!20年以上ITエンジニアとして活動してきた
よこやま良平です。

Wordpress復旧やサイト修復、オンライン講座では
200件以上のレビューを頂いており

「すぐに復旧してくれる!」
「当日行ってくれて助かった!」など

評価は4.9/5.0と非常に高く好評です。

またWordPress、SEO、Officeなど25冊以上の書籍を出版しており、
売上ランキング1位を連続で獲得致しました。

その他これまでに3000以上のサービス・システム・サイトを作成。

多くの方の「できない」や「悩み」を解決してきました。
その観点からわかりやすく解説しています。