初めに
ポートフォリオで、過去1週間の投稿数を表示させるグラフを作成していましたが、
今回リファクタリングをしてみました。
リファクタリング前の実装記事は以下です
リファクタリング前
post.rb
scope :created_yesterday, -> { where(created_at: 1.day.ago.all_day) }
scope :created_2days_ago, -> { where(created_at: 2.days.ago.all_day) }
scope :created_3days_ago, -> { where(created_at: 3.days.ago.all_day) }
scope :created_4days_ago, -> { where(created_at: 4.days.ago.all_day) }
scope :created_5days_ago, -> { where(created_at: 5.days.ago.all_day) }
scope :created_6days_ago, -> { where(created_at: 6.days.ago.all_day) }
リファクタリング後
post.rb
scope :created_days_ago, ->(n) { where(created_at: n.days.ago.all_day) }
グラフ表示の部分で以下のように記載してあげれば、 6日前の投稿、5日前の投稿などが取り出せます。
show.html.erb
data: [<%= @posts.created_days_ago(6).count %>,
<%= @posts.created_days_ago(5).count %>,
<%= @posts.created_days_ago(4).count %>,
<%= @posts.created_days_ago(3).count %>,
<%= @posts.created_days_ago(2).count %>,
<%= @posts.created_days_ago(1).count %>,
<%= @posts.created_days_ago(0).count %>],
さらにリファクタリング
上記の表示部分も長くなってしまってるので修正します。
post.rb
scope :created_days_ago, ->(n) { where(created_at: n.days.ago.all_day) }
#以下追加
def self.past_week_count
(1..6).map { |n| created_days_ago(n).count }.reverse
end
show.html.erb
data: <%= @posts.past_week_count %>,
モデルに追加した記述について理解していきます。
リファクタリング前は、created_days_agoに6~0までの引数を与えていましたが、
(0..6)というrangeオブジェクト
で展開して値を渡すようにします。
そしてmap
を使用して配列にします。
mapは、ループ処理を実行し、処理結果を配列にして返すメソッドです。
このままだと、0~6になってしまうので、反転させるためにreverse
記載します。