はじめに
よくメルカリや、ジモティーなどと言ったフリマ要素のあるのサイトでは
マイページに自分が出品した取引一覧とは別に、
やりとり中の取引一覧
がよく表示されていますよね
取引の度にブックマークするとなかなか面倒くさいので、
何気に重宝する機能なのではないでしょうか
今日はそれを実現するよう実装をしていきたいと思います
モデル間の関係
例のように記事(取引)をarticle、コメント(やりとり)をcomment、とし
各モデルは上記のようなアソシエーションにします。
has_many :articles
has_many :comments
belongs_to :user
has_many :comments
belongs_to :user
belongs_to :article
記事(取引)の取得
helper_method :current_user
private
def current_user
if session[:user_id]
@current_user ||= User.find_by(id: session[:user_id])
end
end
上記のようなログイン中のユーザーを返り値とするヘルパーメソッドcurrent_user
があるとしたうえで、
以下の@article_commented_on
に自分がコメントした記事を取得していきます。
def mypage
@article_commented_on = current_user.messages.includes(:article).map(&:article).uniq
end
current_user.messages
でユーザーが投稿したコメント全てを取得し、
includes(:article)
でarticleとテーブル結合を行います。
そしてmap(&:article)
にてarticleのみを抜き出した新たな配列に返し、
uniq
(クエリー用のメソッドではない配列のメソッド)を実行し重複を消します。
こうすることで@article_commented_on
には自分がコメントしたことのある記事のみを取得することができました。
includes(:article)
でテーブル結合を行うことによって、
各messageに対応したarticleを取得する度に発生するDBへのアクセスを最低限に減らすことができます。
以上です、お疲れ様でした!