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

記事内にプロモーションリンクが含まれる場合があります。

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

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

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

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

無料パソコンスクール講座
WordPress・SEO・プログラミング

あなたは以下のことで 悩んでないだろうか?

「フリーランスになりたいけど稼げるか不安だ」
「クラウドソーシングや営業して稼げるか不安だ」
「転職で必要になり困っている」
「スマホはあるけどパソコンが古くて不安だ」
「広告やLINEからの集客を得たい」
「仕事でグラフや資料制作を思うように作れない」
「プログラミングを学習して副業したいけど不安だ」
「副業をはじめたが、いっこうに成果がでない」
「退職してノートパソコンだけで収入を得たい」
「何がわからないかわからない状態が続き何度も挫折した」
「在宅で稼げるようになりたい」
「副業で収入を得たい」

そんなお悩みのあなたにこそ
取得して頂きたい内容です!

このメディアを運営している制作・プログラミング相談のプロが
全て無料で相談と学習できるように
無料スクールのメルマガ講座を開設しました。

\今なら300部限定無料ダウンロード/

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

いまなら、先着300部限定で無料プレゼント付です。

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

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なので使っていたらわかる。

この記事を書いた人

よこやま良平

よこやま良平

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

4歳~85歳まで、年間1,792人名以上の方に
パソコンやプログラミング講座を行ってきました。

また18冊以上の書籍を出版しており、連続で1位を獲得しました。
オンライン講座では200件以上のレビューを頂いており
評価は4.9/5.0と高評価を得ています。

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