ActiveRecord::Relation을 map으로 짜내 두꺼운 JSON으로 변환

데이터베이스에서 가져온 레코드의 정보를 JS 파일에서 사용하고 싶습니다. 그런 때가 있습니까?

그럴 때는 예,


출처 : 재미있는 TV 정보국

JSON으로 변환합시다.

그러나 모든 열의 정보는 필요하지 않습니다. 게다가 가능하면 어소시에이션으로 취해 온 다른 레코드의 정보도 JSON에 붐비는 것 같다.
이번에는 그런 당신을 위해 map을 사용한 간편한 JSON 변환 방법을 소개합니다.

DB 구성



이번 목표는 트위터와 같은 앱을 이미지하고,
{
  "ジェイソン": ["why", "japanese", "people"],
  "たろう": ["おはよう", "ありがとう"]
}

이런 느낌의 JSON 데이터를 얻는 것을 목표로합니다.

users 테이블과 tweets 테이블이 있다면,
usersテーブル
  nameカラム

tweetsテーブル
  textカラム

association
  user has_many tweets
  tweet belongs_to user

이런 식의 테이블을 상정합니다.

코드는


User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }.to_h.to_json

네, 이것뿐입니다.
순서를 따라 갑시다.

① 해시하고 싶지만 map을 잡아 버린다


User.all.map{ |user| ~~ }

루비계의 JSON이라고 하면 해시군요? 왠지 확실히 닮아 있고 해시라면 JSON에 곧바로 변환할 수 있을 것 같네요.
하지만 루비는 블록 내에서 처리를 하고 결과 해시를 돌려주는 것 같은 편리한 메소드에 나는 아직 만나지 않았습니다.
그래서 먼저 map을 사용하여 배열을 생성합니다.

②[키, 값]의 순서로 취득한다


User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }

map으로 취득하는 배열은 [키, 값]의 순서로 취득합니다.
이번은 아래와 같은 형태이므로,
{"제이슨": ["why", "japanese", "people"]}

배열의 1번째에 유저명, 2번째에 pluck 해 text 정보의 배열을 취득하고 있습니다.

③배열을 해시로


User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }.to_h

취득한 배열을 to_h 메소드로 해시로 변환합니다.
이 때, 배열이 이중 배열이면,
[
  ["ジェイソン": ["why", "japanese", "people"]],
  ["たろう": ["おはよう", "ありがとう"]]
].to_h

=>
{
  "ジェイソン": ["why", "japanese", "people"],
  "たろう": ["おはよう", "ありがとう"]
}

라는 형태로 변환해 줍니다. 편리하네요~.

④ 해시를 JSON으로


User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }.to_h.to_json

해시에 대해 to_json 메소드를 사용하여 JSON으로 만듭니다. 해시와 JSON의 구조는 매우 닮아 있기 때문에 이미지는 간단하네요.
to_h 메소드를 사이에 두지 않고 to_json 메소드를 배열에 사용하면 키와 값의 관계가 잘 반영되지 않기 때문에,
일단 to_h 메소드를 끼우는 것이 간입니다.



네, 어떨까요? 제대로 JSON으로 변환할 수 있었습니까?
이런 마도로 이런 일 하지 않아도 더 쉬운 방법이 있어! 라는 분, 코멘트 기다리고 있습니다! 그럼!

좋은 웹페이지 즐겨찾기