루비 온 레일즈에서 최신 로그들을 가지고 오고 싶다면? 부모 모델과 연결된 자식 모델의 마지막 행들의 값을 가지고 오고 싶다면? (How to get recently log or last row of child model Ruby on Rails )


## 루비 온 레일즈에서 최신 로그들을 가지고 오고 싶다면? 부모 모델과 연결된 자식 모델의 마지막 행들의 값을 가지고 오고 싶다면? (How to get recently log or last row of child model Ruby on Rails )

최근 루비 온 레일즈 프로젝트에서 부모 모델의 각 id에 연결 된 자식 모델의 행 중 맨 마지막 행의 특정 컬럼값이 몇 개인지 세야 했다. 예를 들자면 아래 이미지와 같은 느낌이다.

<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHBWp2xMEj2odqTM53w8FMvDSgUqs3FIukIN3nUPguk29U4yfYR0bvGm_0kCWcOyGElAtuAwLGg3MBkkTELR9Iek2F5_AVks3SuaJXDVy7s6EpbaJWfFFgLSZRvM5oD75ZMJLt1G5Ohx8e/s1600/KakaoTalk_Photo_2020-04-13-14-57-38.png" imageanchor="1" ><img border="0" data-original-height="181" data-original-width="451" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHBWp2xMEj2odqTM53w8FMvDSgUqs3FIukIN3nUPguk29U4yfYR0bvGm_0kCWcOyGElAtuAwLGg3MBkkTELR9Iek2F5_AVks3SuaJXDVy7s6EpbaJWfFFgLSZRvM5oD75ZMJLt1G5Ohx8e/s1600/KakaoTalk_Photo_2020-04-13-14-57-38.png" /></a>

이미 SQL을 그대로 삽입해서 구현한 코드는 있었다. 코드는 아래와 같다.

```ruby
parents = ParentModel.where("created_at > ?", date_value)
parents.where("(SELECT event FROM child_model WHERE parent_model_id = parent_models.id ORDER BY created_at DESC LIMIT 1) = ?", ChildModel.events[:event_name]).count
```

그러나 Rails way, DB 호환성 등을 위해 ActiveRecord를 사용한 코드로 바꿔야했다.

바꾼 코드는 다음과 같다.

```ruby
parents = ParentModel.where("created_at > ?", data_value) #큰 의미 없음
ChildModel.where(parent: parents, id: ChildModel.group(:parent_model_id).maximum(:id).values).group(:event).count["event_name"]
```

ActiveRecord를 사용한 코드라 바꿨고, 걸리는 시간도 조금 줄었다. 코드 설명을 하자면 ChildModel에서 각 parents를 가지고 있으면서 각 ChildModel의 parent 모델의 id 값중 가장 큰 값(최근에 저장된 child model의 데이터)을 group, maximum 으로 묶고 values로 뽑아낸 뒤 where 절의 id: 값에 넣어준다. 그렇게 찾은 데이터들 중에 원하는 컬럼을 group으로 묶고 count한 뒤 원하는 컬럼값을 찾는다.

이 과정을 통해서 알게 된 것은 배열 안의 해쉬 값을 values로 뽑을 수 있다는 것과, where 절을 사용할 때 배열과 같은 것들을 넣을 수 있다는 것이었다. 하지만 정확히 이해는 가지 않아서 고민해봐야겠다.

댓글

이 블로그의 인기 게시물

부트스트랩 사용 시 버튼 오른쪽 정렬하는 방법 (How to use float-right for right align in bootstrap)

맥(Mac)에서 MySql 사용 시 Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 오류가 발생하는 경우 해결 방법

HTML, CSS - footer fixed (foot 하단 고정 시키기)