[掲載日] (更新日) この記事は約 4 分で読めます

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

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

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

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

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

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

Ruby on Railsのプログラミングを最短1ヶ月で習得
RailsHack講座では13日間の無料期間(全額返金保証)で安心のスクールです。
WEBアプリケーションが実際に作成できます。
» RailsHack講座の13日間の無料体験(全額返金保証)はこちら

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

挫折しそうなプログラミングなら動画講座。30日間全額返金保証