Ruby on Railsで関連記事機能を実装する方法

✏️️ 2019/08/15 👍️2019/08/16 🔗

概要

Post Model 対 Tag Modelが多対多のアソシエーションの関係で、関連機能を実装します。

class Post < ApplicationRecord
  DEFAULT_RELATED_POSTS_LIMIT = 3

  has_many :post_tags, dependent: :destroy
  has_many :tags, through: :post_tags
end

Model

related_posts メソッドを作成します。同じタグが含まれているPostをランダムに3つ取得します。

# app/models/post.rb

DEFAULT_RELATED_POSTS_LIMIT = 3

def related_posts(quantity = DEFAULT_RELATED_POSTS_LIMIT)
  Post.joins(:tags)
      .where(tags: { name: tags.pluck(:name) })
      .where.not(id: id)
      .distinct
      .sample(quantity)
  end

Controller

app/controllers/posts_controller.rb で関連記事を取得します。

# app/controllers/posts_controller.rb

def show
  @related_posts = @post.related_posts
end

以上で、関連記事機能が実装できました。

akito
日本のスタートアップで主にRuby on Railsを使ってプロダクト開発をしています。