質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

1882閲覧

RailsのModelに木構造の条件付きhas_manyを設定する方法

coffee_man

総合スコア13

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2018/01/25 14:28

RailsのModelに木構造の条件付きhas_manyを設定するにはどうすればいいのでしょうか?

カテゴリーモデルとプロダクトモデルがあります。

ruby

1class Category < ApplicationRecord 2 acts_as_tree name_column: :link 3 has_many :products 4end

ruby

1class Product < ApplicationRecord 2 belongs_to :category, inverse_of: :products 3end

カテゴリーモデルはacts_as_treeにより木構造になっています。
例えばトップカテゴリーをコンピュータとすると以下のようにその下にサブカテゴリーが入っています。

├── computer │   ├── laptop │   ├── desktop │   └── smart_phone ├── game │   ├── nintendo │   ├── play_station

各カテゴリーはhas_many :productsなのですが、実際にプロダクトが入っているのはサブカテゴリー以下です。つまり上記の例ではcomputerとgameはトップカテゴリーなのでプロダクトは入っていません。

laptopやsmart_phoneはサブカテゴリーなので、この中にはプロダクトが入っています。

ruby

1> Category.find_by(link: 'computer/laptop').products.pluck(:name) 2[ "MacBook", "MacBookAir" ] 3> Category.find_by(link: 'computer/smart_phone').products.pluck(:name) 4[ "iPhone5s", "iPhoneX" ] 5> Category.find_by(link: 'computer').products.pluck(:name) 6[]

これに条件付きhas_manyを設定してトップカテゴリーのcomputerにもプロダクトを持たせるにはどうすればいいのでしょうか?
多対多のリレーションを使わず、両者の関係はこのまま1対多として、条件がトップカテゴリーの場合だけ、そのカテゴリーに入っているサブカテゴリーのプロダクトをhas_manyとして表示したいと考えています。
以下の結果を得ることが目的です。

ruby

1> Category.find_by(link: 'computer').products.pluck(:name) 2[ "MacBook", "MacBookAir", "iPhone5s", "iPhoneX" ]

ヒントでもいただければ幸いです。

Rails 5.1
PostgreSQL

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

CategoryにMacBook,MackBookPro,iphone5などを入れて、MacBook,MackBookPro,iphone5のtype_nameを指定する方が良くないですか?

実際にはCategoryTypeモデルを別途作りますけど

Category.where(type_name: computer).pluck(:name)

プロダクトとカテゴリが多対一
カテゴリとカテゴリタイプが多対一

投稿2018/01/25 17:04

mtdsnsk

総合スコア789

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問