json 출력에 가상 특성 추가
TODO 목록을 처리하는 앱이 있다고 가정해 보겠습니다.목록이 완료되고 완료되지 않은 항목이 있습니다.이제 목록 개체에 목록 내 완료 항목과 완료되지 않은 항목의 수라는 두 가지 가상 속성을 추가합니다.json 출력에도 표시해 주었으면 합니다.
내 모델에는 미완성/완성 아이템을 가져오는 두 가지 방법이 있습니다.
def unfinished_items
self.items.where("status = ?", false)
end
def finished_items
self.items.where("status = ?", true)
end
그러면 어떻게 하면 json 출력에서 이 두 가지 메서드의 카운트를 얻을 수 있을까요?
Rails 3.1을 사용하고 있습니다.
Rails의 객체 직렬화에는 두 가지 단계가 있습니다.
- 첫번째,
as_json
개체를 단순화된 해시로 변환하기 위해 호출됩니다. - 그리고나서,
to_json
에서 호출됩니다.as_json
값을 반환하여 최종 JSON 문자열을 가져옵니다.
당신은 대체로 떠나고 싶어 한다.to_json
따라서 다음과 같이 자체 구현만 추가하면 됩니다.
def as_json(options = { })
# just in case someone says as_json(nil) and bypasses
# our default...
super((options || { }).merge({
:methods => [:finished_items, :unfinished_items]
}))
end
다음과 같이 할 수도 있습니다.
def as_json(options = { })
h = super(options)
h[:finished] = finished_items
h[:unfinished] = unfinished_items
h
end
메서드 기반 값에 다른 이름을 사용하는 경우.
XML 및 JSON 에 관심이 있는 경우는, 을 참조해 주세요.
레일 4에서는 다음을 수행할 수 있습니다.
render json: @my_object.to_json(:methods => [:finished_items, :unfinished_items])
이것이 최신/최신 버전에 있는 사람에게 도움이 되기를 바랍니다.
또 다른 방법은 모델에 추가하는 것입니다.
def attributes
super.merge({'unfinished' => unfinished_items, 'finished' => finished_items})
end
이것은 xml 시리얼라이제이션에서도 자동적으로 동작합니다.http://api.rubyonrails.org/classes/ActiveModel/Serialization.html 단, 이 방법에서는 레일 3의 키를 정렬할 때 기호를 처리할 수 없기 때문에 키에 문자열을 사용하는 것이 좋습니다.하지만 4번 레일에 정렬되어 있지 않기 때문에 더 이상 문제가 없을 것입니다.
모든 데이터를 하나의 해시에 닫으면 됩니다.
render json: {items: items, finished: finished, unfinished: unfinished}
기존 as_json 블록에 통합하려는 저와 같은 사람에게 이 답을 제공해야겠다고 생각했습니다.
def as_json(options={})
super(:only => [:id, :longitude, :latitude],
:include => {
:users => {:only => [:id]}
}
).merge({:premium => premium?})
그냥 택.merge({})
마지막까지super()
이렇게 하면 추한 오버라이드를 하지 않아도 됩니다.모델이 있는 경우List
예를 들어, 컨트롤러에 다음과 같이 설정할 수 있습니다.
render json: list.attributes.merge({
finished_items: list.finished_items,
unfinished_items: list.unfinished_items
})
Aswin은 위에 열거한 바와 같이:methods
특정 모델의 메서드/함수를 json 속성으로 반환할 수 있습니다.복잡한 어소시에이션이 있는 경우 기존 모델/어소시에이션에 기능이 추가되기 때문에 이 기능은 유효합니다.D를 재정의하지 않으면 매력처럼 동작합니다.as_json
제가 어떻게 .:methods
만 아니라:include
[N+ 리;;;;;;;;;]
render json: @YOUR_MODEL.to_json(:methods => [:method_1, :method_2], :include => [:company, :surveys, :customer => {:include => [:user]}])
" " "as_json
더이 시나리오에서는 이 더 ).:include
"/ " " " " :/ def as_json(options = { }) end
개체의 배열을 가상 속성과 함께 렌더링하려면
render json: many_users.as_json(methods: [:first_name, :last_name])
서 ''는first_name
★★★★★★★★★★★★★★★★★」last_name
되어 있는 속성입니다.
언급URL : https://stackoverflow.com/questions/6892044/add-virtual-attribute-to-json-output
'programing' 카테고리의 다른 글
한 페이지 앱에서 잘못된 URL(404 오류)에 대처하는 올바른 방법은 무엇입니까? (0) | 2023.03.26 |
---|---|
같은 방법을 여러 번 연속으로 사용 (0) | 2023.03.21 |
apple-app-site-association json 파일이 app에서 업데이트 된 적이 있습니까? (0) | 2023.03.21 |
React.js: setState 덮어쓰기, 병합 안 함 (0) | 2023.03.21 |
OOP를 사용한 WordPress 플러그인 개발 (0) | 2023.03.21 |