joppot

コピペで絶対動く。説明を妥協しない

プログラミング

railsの多対多リレーションでcounter culture を使用する

投稿日:


countermanytomanythumb

概要

みなさんこんにちはcandleです。
今回は多対多のリレーションが貼られているrailsアプリケーションで、counter cultureを使ってレコード数を数えてみたいと思います。

以下のようなモデルで試してみたいと思います。

erddiagram1

モデルはこんな感じ

class Food < ActiveRecord::Base
  has_many :food_dishes
  has_many :dishes, through: :food_dishes
end

class Dish < ActiveRecord::Base
  has_many :food_dishes
  has_many :foods, through: :food_dishes
end

class FoodDish < ActiveRecord::Base
  belongs_to :food
  belongs_to :dish
end

サンプルデータはこんな感じ

foodsdata
dishesdata

food_dish中間モデルには何もありません。


前提

適当な多対多のモデルがある



カウントしたいモデルにカラムを追加する

例えば、上の例でいくと、どの料理(dish)がどのくらいの数の食材(food)を使っているか数えたい場合があります。

私の場合はdishモデルにcounter cultureのカラムを追加します。

重要なのは多対多のリレーションでcounter cultureを使用する時は中間モデルを数えるようにします。
dishはfoodを数えるのではなく、中間テーブルのfood_dishモデルを数えるようにします。

それではカラムを追加します。

多対多でcounter cultureのカラム追加は以下のようにします。

bin/rails g counter_culture 親のモデル名 複数形の中間モデル名_count

今回の場合は

bin/rails g counter_culture Dish food_dishes_count

になります。

counter_culture_food_dishes

マイグレーションしましょう。

bin/rake db:migrate

counter_cultureのモデルの設定

後は簡単です。
普段の通り、中間モデルにcounter_cultureの設定を記述します。
中間モデルを開いて、以下を記述します。

counter_culture 親のモデル名

私の場合はfood_dish.rbを開いて、以下を記述しました。

counter_culture :dish

counter_culture_dishsetting

counter_cultureの設定は以上です。

中間モデルを追加してカウントされるかチェックする

試しに中間モデルを追加してdish側でカウントが追加されるか確認します。

今現在、dishの食材カウントは0です。

food_dish_countis_zero

railsコンソールから追加してみます。

bin/rails c
FoodDish.create(dish_id: 1, food_id: 1)

runcreatefood_dish_model
無事作成できました。
データベースを見てみましょう。

updatefood_count

値が上がっていますね。
うまくいきました。

まとめ

counter_cultureはよく使うのですが、多対多ではあまり使用したことがなかったので、まとめてみました。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-プログラミング
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Chart.js 2.0でy軸の最大値(scales max)と最小値を設定する

概要 みなさんこんにちはcandleです。今回はChart.js2.0でy軸の最大値、最小値を設定する方法を紹介します。 Chart.js 2.0では特に指定しないと自動的に、y軸の最大値を設定してく …

fabricでmysqlコマンドを実行する関数を自作する

概要 皆さんこんにちはcandleです。今回はfabricからリモート先のサーバのmysqlを実行するための環境変数と関数を作成したいと思います。 mysqlは一般にmysqlコマンドをログインしてか …

fluentdでrails logをtailで直接取得する方法

概要 追記) この記事はだいぶ古くなってしまったので、新しく書き直しました。 こちらの方を参照した方が多分良いことが書いてあります。 https://joppot.info/2017/03/17/35 …

MAMPのSQLiteManagerを使用してsqlite3データベースの作成とデータベースファイルの設置

概要 みなさんこんにちはcandleです。今回はsqliteデータベースをMAMPを使用して作成しましょう。 PHP5.3からsqlite3のクラスが充実して、mysqlを使用しなくてもsqliteで …

Hiragino Sansフォントウェイトのcss書き方まとめ

概要 みなさんこんにちはcandleです。今回はHiragino Sansのcssの書き方を紹介します。 Hiragino Sansの特徴はフォントの太さを1から9段階まで変えられることです。 一方で …

  • English
  • 日本語

ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー