joppot

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

プログラミング

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

投稿日:

Pocket

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中間モデルには何もありません。


前提

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

SPONSORED LINK


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

例えば、上の例でいくと、どの料理(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

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

関連記事

react0.14 + gulp + express + babelでReactのチュートリアル環境構築をする

概要 みなさんこんにちはcandleです。今回は、react0.14のnodeの環境構築をします。 react0.14はまだまだ、開発段階にあり、しばしば仕様変更が行われています。 0.13の時では使 …

macでreact nativeの環境構築をして、iosアプリのhello worldをする

概要 みなさんこんにちはcandleです。 今回は、react nativeの環境構築をmac上で行い、iosアプリでhello worldをしてみたいと思います。 react nativeはreac …

react nativeのandroidでfailed to find Build Tools revision 23.0.1エラーが出る時の対処

概要 みなさんこんにちは、candleです。今回はreact nativeでrun-androidでbuildが失敗する時の対処です。 私の場合最新のandroid-sdkを入れたところ、以下のような …

正規表現を極めるその1

概要 みなさんこんにちはcandleです。今回から正規表現を1から100まで極めようと思います。 正規表現って、使えると便利ですが、それを勉強して使いこなせている人って少ないと思います。この機会にぜひ …

Mac OS 10.9 Marvericks のMacportsでインストールしたOpencv2.4.8はXcode5、ターミナルでは使えない

概要 みなさんこんにちはcandleです。今回はopencv2.4.8が使えないという事を記事にさせてもらいます。 とは言うものの、2014年2月16日の話であって、今後修正されていくと思うので、その …

  • English
  • 日本語

プロフィール


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

twitter

スポンサードリンク

アーカイブ