🤸‍♂️

【Rails】UX向上のためのActive Recordを使った具体的なデータベース操作

2023/10/06に公開

Active Recordを使った具体的なデータベース操作

Active Recordというマッピング(ORM)ツールを使用すると、データベース操作が簡単にできます。データベースから取得したデータを適切に表示させることでユーザーエクスペリエンスの向上にも繋がります。今回は、Active Recordを使った具体的なデータベース操作に焦点を当て、具体的な使い方と実際に作成した具体例を説明していきます。

以下記事も参考になれば嬉しいです。
https://zenn.dev/ganmo3/articles/3d2a724e9e49ef

1. 最新のデータの取得

データベースから最新の情報を取得する方法です。.order.takeを駆使して、最新の投稿や情報を取得します。

# 最新のデータの取得
latest_records = ModelName.order(created_at: :desc).take(limit)

具体例

俺の場合は最新のpostを表示させるために以下のようにしました。

  • モデルに定義
post.rb
# 最新の投稿を取得
def self.find_daily_new_posts(limit)
 published.order(created_at: :desc).take(limit)
end

以下のようにenum管理しており、published(公開)ステータスのみを抽出しています。

# 投稿ステータス
enum status: { published: 0, draft: 1,  unpublished: 2 }
  • コントローラで呼び出し
@daily_new_posts = Post.find_daily_new_posts(5)

上記のようにデータを抽出し、トップページやpostの詳細ページに最新の投稿を表示させました。

2. 条件に基づくデータのフィルタリング

データベースから条件に一致するデータを取得する方法について説明します。.whereを使用して、特定の条件に合致するデータを抽出します。

# 条件に基づくデータの取得
filtered_records = ModelName.where(condition).limit(limit)

具体例

デイリーベストの投稿を定義し、取得してみます。

  • モデルに定義
post.rb
# デイリーベスト投稿を取得するためのメソッド
def self.find_daily_best
  # 昨日の日付を取得
  yesterday = Date.yesterday

  # 昨日の日の始まりと終わりを設定
  start_of_day_yesterday = yesterday.beginning_of_day
  end_of_day_yesterday = yesterday.end_of_day

  # 昨日の中で視聴回数が最も多い投稿を取得
  yesterday_best = published
                       .where('created_at <= ?', end_of_day_yesterday)
                       .order(impressions_count: :desc)
                       .first

  # 昨日のベスト投稿が存在しない場合、今日の中で視聴回数が最も多い投稿を取得
  if yesterday_best.nil?
    # 今日の日付を取得
    today = Date.today

    # 今日の日の始まりと終わりを設定
    start_of_day_today = today.beginning_of_day
    end_of_day_today = today.end_of_day

    # 今日の中で視聴回数が最も多い投稿を取得
    today_best = published
                     .where('created_at <= ?', end_of_day_today)
                     .order(impressions_count: :desc)
                     .first

    return today_best
  end

  # 昨日のベスト投稿を返す
  return yesterday_best
end
  • コントローラで呼び出し
@daily_best = Post.find_daily_best

上記のようにデータを抽出し、トップページにデイリーベストの投稿を表示させました。

3. 関連テーブルのデータの取得

.joinsを活用して、関連テーブルのデータを取得します。

# 関連テーブルのデータの取得
related_data = ModelName.joins(:association_name).where(condition)

具体例

週間ランキングを作ってみます。
俺の場合は、impressionistというgemを使い、postテーブルにimpressions_count(PV数)というカラムを持たせています。

post.rb
# 1週間でPVが多い投稿を取得するためのメソッド
def self.weekly_most_viewed_posts(limit)
  today = Date.today
  start_of_week = today.beginning_of_week(:sunday)
  end_of_week = today.end_of_week(:sunday)

  # impressions_count(ページビューカウント)の降順で投稿を取得
  # ここで内部結合(joins)を使用し、impressionsテーブルと結合します
  # created_atカラムが今週の範囲内(start_of_weekからend_of_week)のimpressionsを対象にします
  # 投稿ごとにグループ化し、その後ページビューカウントの降順でソートし、指定した数(limit)だけ取得
  most_viewed_posts = published
                     .order(impressions_count: :desc)
                     .joins(:impressions)
                     .where(impressions: { created_at: start_of_week..end_of_week })
                     .group('posts.id')
                     .order('COUNT(impressions.id) DESC')
                     .limit(limit)

  # 最もPVが多い投稿のリストを返す
  most_viewed_posts
end

コントローラで呼び出し

@weekly_most_viewed_posts = Post.weekly_most_viewed_posts(3)

上記のようにデータを抽出し、トップページに週間ランキングの投稿を表示させました。

4. 集計と統計情報の取得

データベースから集計と統計情報を取得する方法について説明します。.group.sumなどのメソッドを使用して、データの統計情報を計算します。

# 集計と統計情報の取得
summary_data = ModelName.group(:column_name).sum(:numeric_column)

具体例

人気記事の投稿を定義しデータを取得します。
人気記事の定義が難しかったのですが、俺の場合は以下のようにしました。

post_favorite(いいね)テーブルを作っているので、joinsも活用します。

# 3日間でいいねが多い投稿を取得するためのメソッド
def self.daily_popular_posts(limit)
  start_date = 3.days.ago.to_date
  end_date = Date.today

  # 3日間でいいねが多い順にソートされた投稿を取得
  posts_within_period = published
    .joins(:post_favorites) # いいねのある投稿のみを取得するためにJOIN
    .where('posts.created_at >= ? AND posts.created_at <= ?', start_date, end_date)
    .group('posts.id')
    .order('COUNT(post_favorites.id) DESC')

  # 最終的な結果をlimitの数だけ返す
  posts_within_period.take(limit)
end

コントローラで呼び出し

@daily_popular_posts = Post.daily_popular_posts(5)

上記のようにデータを抽出し、トップページに人気記事の投稿を表示させました。

まとめ

Active Recordを使ったデータベース操作は、ユーザーエクスペリエンスの向上のためには重要なスキルだと思いますし、ユーザーに効果的な情報を提供するために役立つはずです!使いこなすのは難しかったのですが、具体的に使用し、サイトの魅力を高めていけたらいいですね!


最後までお読みいただきありがとうございました。

Discussion