概要
DraperでAssociationして、親モデルからDecorateされた子モデルを取得する時に少しハマったので、手順を残します。
モデルの内容
BookとReviewが1対多の関係になっている。
class Book < ApplicationRecord
has_many :reviews
end
class Review < ApplicationRecord
belongs_to :book
end
やりたいこと
book.reviews
でアクセスした時のreview.created_at
をフォーマットした状態にしたい。
- Decorateしていない状態だとこうなる。
@book = Book.find(1)
@book.reviews.first.created_at
=> Sun, 10 Mar 2019 06:14:33 UTC +00:00
- Decorateしてフォーマットした時刻を出力したい。
@book = Book.find(1).decorate
@book.reviews.first.created_at
=> "2019/03/10 06:14"
やり方
-
BookDecorator
内でReviewsDecorator
をアソシエーションする。
class BookDecorator < Draper::Decorator
delegate_all
decorates_associations :reviews
# もし1対1の場合は以下のように設定する。
decorates_association :review
end
-
ReviewDecorator
にデコレートする内容を書く。
class ReviewDecorator < Draper::Decorator
delegate_all
def created_at
return object.created_at.strftime("%Y/%m/%d %H:%M")
end
end
結果
フォーマットされた出力結果が得れた。
@book = Book.find(1).decorate
@book.reviews.first.created_at
=> "2019/03/10 06:14"