質問: いつもお世話になります。 現在RailsでSNSのようなものを作っており、いわゆる「いいね機能」を実装しようと考えています。以下のような3つのテーブルを用意しており「いいねボタン」が押されると「Likeテーブル」の「user_id:」に「Userテーブル」の「id:」を、「Likeテーブル」の「tweet_id:」に「Articleテーブル」の「id:」をそれぞれ書き込み、likes_countカラムにその投稿に関連したレコード(投稿に対する総いいね数)をLikeテーブルから数えて表示するようにしております。 この状態でArticleテーブルと同じカラムを持った「Article_other」というテーブルを新たに作り、そちらもLikeテーブルと関連付けて運用したいと考えているのですがうまくできません。 現在は以下のように書いているのですが、例えば「Articleテーブル」のid番号3にいいねをした場合に、「Article_otherテーブル」の方にもいいねがカウントされてしまいます。 「Articleテーブル」「Article_otherテーブル」2つを区別するようにLikeテーブルを管理する方法が分からず難航しております。 参考になるサイトでも構いませんのでご教示いただけると幸いです。 よろしくお願いいたします。 ``` Articleテーブル id: 投稿ID poster_name: 投稿者名 post_text: 投稿内容 likes_count: 総いいね数 Likeテーブル user_id: ユーザーID tweet_id: 投稿ID Userテーブル id: ユーザーID name: ユーザー名 pass: パスワード class Article < ApplicationRecord has_many :likes, dependent: :destroy, foreign_key: :tweet_id end class Like < ApplicationRecord belongs_to :article, counter_cache: :likes_count, optional: true, foreign_key: :tweet_id # ↓article_other用に追加 belongs_to :article_other, counter_cache: :likes_count, optional: true, foreign_key: :tweet_id end # ↓article_other用に追加 class ArticleOther < ApplicationRecord has_many :likes, dependent: :destroy, foreign_key: :tweet_id end ```
回答: ポリモーフィック関連付けを試されてはいかがでしょうか.内部的には,テーブル名を格納するフィールドを追加し,その値に応じて対応するモデルが利用されるようになります. Rails ガイド Active Record の関連付け 2.9 ポリモーフィック関連付け ``` class Like < ApplicationRecord belongs_to :likable, polymorphic: true end class Article < ApplicationRecord has_many :likes, as: :likable end class ArticleOther < ApplicationRecord has_many :likes, as: :likable end ``` Likable という不自然な命名については,「Like をつけることができる」を表す適切なものにして下さいね