中間テーブルを介してデータを取得する方法(rails)
中間テーブルを介してデータを取得する方法について、 忘備録としてここに記しておきます。
例:
productsテーブル
product_categoriesテーブル(中間テーブル)
categoriesテーブル
があるとします。
一つの商品(product)はいくつかのカテゴリー(category)を持ち、
一つのカテゴリー(category)はいくつかの商品(product)を持つので、
多対多の関係が成り立ちます。
中間テーブルはproduct_categoriesテーブルです。
そして、中間テーブルに保存されているレコードの値でを引っ張り出したい時、
こんな風に記述します。
@product.product_categories
category = @product.product_categories.select(:category_id)
とい部分。
@product.product_categoriesというのは、 商品(product)から、 中間テーブルであるproduct_categoryテーブルにいき、
その後、
〜.select(:category_id)で、
@productに代入されている商品のカテゴリidのみを取得するという意味になります。
このselectというのは、 テーブルの中で指定したカラムのみを取得したいときに用います。
そして、次の行の、
product_category = category.last
category_id = product_category[:category_id]
という部分では、 複数あるカテゴリの中で最後にレコードに当たるカテゴリのみを、 product_categoryに代入するということになります。
そして、product_category[:category_id]により、
カテゴリidのみを、category_idに代入しています。
最後に、
@products = Category.find(category_id).products
とすることで、 関連するカテゴリの商品を取り出し、@productsに代入することができます。
あとは、ビューファイルにて、 @productsに代入された情報を表示します。
- @products.each do |product| %h2 = product.name .price-box ¥ = product.price .price-box-tax (税込)
上記のようにビューで記述すれば、 商品の名前、値段を表示することができます。
それでは、この辺で!