【Rails】복수 모델의 작성 일자 일람을 중복 없이 표시한다

1913 단어 루비Rails
포트폴리오 작성중의 배움의 아웃풋으로서 투고하겠습니다.
공부용 앱을 작성하는 동안 구현한 저장된 답변(여러 모델 존재)을 날짜순으로 중복 없이 표시하는 방법입니다.

실현하고 싶은 것



users_controller의 show 액션으로 대답 작성 일자 일람을 view에 표시해 각각의 일자를 클릭하면 그 일에 작성된 대답 일람을 확인할 수 있도록(듯이) 하고 싶다.
※아래 그림의 이미지


모델



응답 모델로서 「answer」과 「reaction」이 존재.

show 액션 및 view 내용



users_controller.rb
 def show
    @answers_dates = current_user.answers.map{|dates| dates.created_at.to_date}
    @reactions_dates = current_user.reactions.map{|dates| dates.created_at.to_date}
    @dates = @answers_dates.push(@reactions_dates).flatten.uniq.sort.reverse
  end

show.html.erb
  <% @dates.each do |record| %>
      <li>
       <%= link_to record, answers_path(created_at: record) %>
   </li>
  <% end %>

내용 설명


@answers_dates = current_user.answers.map{|dates| dates.created_at.to_date}
@reactions_dates = current_user.reactions.map{|dates| dates.created_at.to_date}

모든 응답과 반응을 인스턴스 변수에 배열로 저장합니다. 동시에 연월일만 표시되면 좋기 때문에 to_date 메소드를 사용하여 변환.
@dates = @answers_dates.push(@reactions_dates).flatten.uniq.sort.reverse

두 개의 배열을 push 메소드로 결합. 결합하면 배열이 중첩 구조가 되므로(ex,[2021-09-08, [2021-09-08,2021-09-09]]), flatten 메소드로 중첩 구조를 제외한다. uniq 메소드로 중복을 제거하고, 또한 sort.reverse로 날짜가 가까운 순서로 정렬한다.
※ 중첩 구조를 제거하지 않으면 uniq에서 위의 예라면 2021-09-08의 중복을 제거할 수 없다.
 <% @dates.each do |record| %>
      <li>
       <%= link_to record, answers_path(created_at: record) %>
   </li>
  <% end %>

이후에는 표시되는 날짜에 링크를 부속해, 그 일자를 params로서 패스에 주는 것으로 그 일자에 작성된 모델을 꺼낼 수 있다.

좋은 웹페이지 즐겨찾기