복붙노트

[RUBY-ON-RAILS] JSON 출력에 가상 속성을 추가합니다

RUBY-ON-RAILS

JSON 출력에 가상 속성을 추가합니다

하자 내가 TODO 목록을 처리하는 응용 프로그램을 말한다. 목록이 완성 및 미완성 항목이 있습니다. 지금은 목록 객체에 대한 두 개의 가상 속성을 추가 할; 목록의 완성과 미완성 항목의 수입니다. 또한 이들은 JSON 출력에 표시해야합니다.

나는 미완성 / 완성 된 항목을 가져옵니다 내 모델의 두 가지 방법이있다 :

def unfinished_items 
  self.items.where("status = ?", false) 
end 

def finished_items 
  self.items.where("status = ?", true) 
end

그럼, 어떻게 내 JSON 출력이 두 방법의 수를 얻을 수 있나요?

나는 레일 3.1을 사용하고 있습니다

해결법

  1. ==============================

    1.레일의 객체 직렬화는 두 단계가 있습니다 :

    레일의 객체 직렬화는 두 단계가 있습니다 :

    당신은 일반적으로 그렇게 모든 당신 정렬이 등으로 자신의 as_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을 걱정하는 경우, serializable_hash를 보라.

  2. ==============================

    2.레일 4를 사용하면 다음 작업을 수행 할 수 있습니다 -

    레일 4를 사용하면 다음 작업을 수행 할 수 있습니다 -

    render json: @my_object.to_json(:methods => [:finished_items, :unfinished_items])
    

    이것은 이상 / 최신 버전에 누군가가 도움이되기를 바랍니다

  3. ==============================

    3.이 작업을 수행하는 또 다른 방법은 모델이 추가입니다 :

    이 작업을 수행하는 또 다른 방법은 모델이 추가입니다 :

    def attributes
      super.merge({'unfinished' => unfinished_items, 'finished' => finished_items})
    end
    

    이것은 또한 자동으로 XML 직렬화에 대해 작동합니다. http://api.rubyonrails.org/classes/ActiveModel/Serialization.html 이 방법은 레일 3의 키를 정렬 할 때 문자를 처리 할 수없는 그러나이 레일 4 정렬되지 않기 때문에, 당신은 키에 대한 사용 문자열을 인식하지만를 할 수 있습니다, 그래서 더 이상 문제가 안된다.

  4. ==============================

    4.단지 주변 모든 데이터를 하나의 해시에 같은

    단지 주변 모든 데이터를 하나의 해시에 같은

    JSON 렌더링 : {항목 : 항목, 완성 : 완성, 미완성 : 미완성}

  5. ==============================

    5.난 그냥 기존 as_json 블록에이 통합하려고했던 자신과 같은 사람,이 답을 제공 할 거라고 생각 :

    난 그냥 기존 as_json 블록에이 통합하려고했던 자신과 같은 사람,이 답을 제공 할 거라고 생각 :

      def as_json(options={})
        super(:only => [:id, :longitude, :latitude],
              :include => {
                :users => {:only => [:id]}
              }
        ).merge({:premium => premium?})
    

    수퍼의 마지막에 그냥 압정 .merge ({}) ()

  6. ==============================

    6.Aswin 위에 나열된으로 : 방법은 기존 모델 / assossiations에 기능을 추가하기 때문에이 트릭을 할 것입니다 복잡한 assosiations이 경우, JSON 속성으로 특정 모델의 방법 / 기능을 반환 할 수 있도록합니다 : D 그것을 작동합니다 마법처럼 당신은 as_json을 다시 정의 싶지 않는 경우

    Aswin 위에 나열된으로 : 방법은 기존 모델 / assossiations에 기능을 추가하기 때문에이 트릭을 할 것입니다 복잡한 assosiations이 경우, JSON 속성으로 특정 모델의 방법 / 기능을 반환 할 수 있도록합니다 : D 그것을 작동합니다 마법처럼 당신은 as_json을 다시 정의 싶지 않는 경우

    이 코드를 확인하고, 내가 사용하는 방법을 공지 사항 : 방법이 아니라 같이 포함을 [N + 쿼리도 옵션이 아닙니다)]

    JSON 렌더링 : @ YOUR_MODEL.to_json (: 방법 => [: method_1 : method_2는], [: 회사 : 설문 조사 : 고객 => {: 포함 => [: 사용자]}] => 포함)

    수동으로 연결을 포함 : 덮어 쓰기 as_json 기능 (당신은 추가 할 필요가 특별하기 때문에이 시나리오에서 방법 어렵게 될 것입니다 / DEF as_json (옵션 = {}) 종료

  7. ==============================

    7.이 못생긴 overridings을 할 필요없이, 할 것입니다. 당신은 예를 들어 모델 목록을 가지고 있다면, 당신은 당신의 컨트롤러에이를 넣을 수 있습니다 :

    이 못생긴 overridings을 할 필요없이, 할 것입니다. 당신은 예를 들어 모델 목록을 가지고 있다면, 당신은 당신의 컨트롤러에이를 넣을 수 있습니다 :

      render json: list.attributes.merge({
                                           finished_items: list.finished_items,
                                           unfinished_items: list.unfinished_items
                                         })
    
  8. from https://stackoverflow.com/questions/6892044/add-virtual-attribute-to-json-output by cc-by-sa and MIT license