【Rails】UX向上のためのActive Recordを使った具体的なデータベース操作
Active Recordを使った具体的なデータベース操作
Active Recordというマッピング(ORM)ツールを使用すると、データベース操作が簡単にできます。データベースから取得したデータを適切に表示させることでユーザーエクスペリエンスの向上にも繋がります。今回は、Active Recordを使った具体的なデータベース操作に焦点を当て、具体的な使い方と実際に作成した具体例を説明していきます。
以下記事も参考になれば嬉しいです。
1. 最新のデータの取得
データベースから最新の情報を取得する方法です。.order
と.take
を駆使して、最新の投稿や情報を取得します。
# 最新のデータの取得
latest_records = ModelName.order(created_at: :desc).take(limit)
具体例
俺の場合は最新のpostを表示させるために以下のようにしました。
- モデルに定義
# 最新の投稿を取得
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)
具体例
デイリーベストの投稿を定義し、取得してみます。
- モデルに定義
# デイリーベスト投稿を取得するためのメソッド
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数)というカラムを持たせています。
# 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