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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。