株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題を解決することができます。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい
また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。
前提
親子関係のあるテーブルで子レコードが親レコードに2つの紐付きがある場合のアソシエーションのさせたい場合がありました。
例えば、商品(Product)があり、その商品の詳細画面でおすすめの商品を3つ表示したいという場合です。
この場合、商品テーブル(products_table)に紐づく形でおすすめ商品テーブル(product_recommend_products_table)を作成しました。
そうなるとproduct_recommend_products_table
から products_table
に対して、2つの外部キーを紐づける形になります。
その際に、Railsのアソシエーションの設定が少し複雑だったので、備忘録として残しておきます。
実装
Productモデルのアソシエーションの書き方
app/models/product.rb
class Product < ApplicationRecord
has_many :product_recommend_products, foreign_key: :associated_product_id, dependent: :destroy, inverse_of: :associated_product
has_many :recommend_products, through: :product_recommend_products, source: :recommend_product
end
ProductRecommendProductモデルのアソシエーションの書き方
app/models/product_recommend_product.rb
class ProductRecommendProduct < ApplicationRecord
belongs_to :associated_product, class_name: 'Product', foreign_key: :associated_product_id
belongs_to :recommend_product, class_name: 'Product', foreign_key: :recommend_product_id
end
参考記事