0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsで親テーブル(親レコード)に対して子テーブル(子レコード)から複数の紐付きをする際のアソシエーション設定

Posted at

株式会社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

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?