2014-04-29 3 views
0

나는이 그냥 속편 모델을 사용 가능하다고 생각하지만, 내가 뭘하고 싶은 내 상위 모델 (저자) 출력 하위 모델 (도서)가하지 않는 때 Author.to_json과 같은 것을하십시오.루비 : 출력하기 속편 모델 협회

require 'sequel' 
require 'json' 

db = Sequel.connect('postgres://localhost/testing'); 

class Sequel::Model 
    self.plugin :json_serializer 
end 

class Author < Sequel::Model(:author) 
    one_to_many :book, key: :author_id, primary_key: :id 

    def get_author 
    Author.each do |e| 
     books = Array.new 
     e.book.each do |f| 
     books.push(f.values) 
     end 
     e.values[:books] = books 
     puts JSON.pretty_generate(e.values) 
    end 
    end 
end 

class Book < Sequel::Model(:book) 
end 

author = Author.new 
author.get_author 

내 출력은 다음과 같은 : : 여기 내 코드입니다 정확히 내 출력이보고 싶은 방법은

[{ 
    "id": 1, 
    "name": "Jack Johnson", 
    "books": [{ 
    "id": 4, 
    "name": "Songs with Chords", 
    "genre": "Learning", 
    "author_id": 1 
    }] 
}, { 
    "id": 2, 
    "name": "Mulder", 
    "books": [{ 
    "id": 2, 
    "name": "UFOs", 
    "genre": "Mystery", 
    "author_id": 2 
    }, { 
    "id": 3, 
    "name": "Unexplained Paranorma", 
    "genre": "Suspense", 
    "author_id": 2 
    }] 
}, { 
    "id": 3, 
    "name": "Michael Crichton", 
    "books": [{ 
    "id": 1, 
    "name": "Jurassic Park", 
    "genre": "Incredible", 
    "author_id": 3 
    }] 
}] 

은,하지만 난 그것에 대해거야 방법은 의문이다. 이상적으로, 저에게 이렇게 할 수있는 저자 모델에 이미 일부 기능이 있다면 그것은 멋지 겠지요 ... 다른 연관성이있는 모든 모델에 대해 get_model 함수를 구현하고 싶지 않기 때문에 이상적입니다. . 또한 NestedAttributes이 여기에 손을 빌려 주길 바랬지 만 보이지 않습니다.

저는 Ruby와 Sequel에 매우 익숙합니다. 그래서 이것을 수행하는 더 간단한 방법이 있는지 알고 싶습니다.

+1

JSON이 유효하지 않으므로 작동하지 않습니다. 일반적으로 당신이 원하는 것을하고, 클래스에 대해'to_json'을 정의하고, 그 메소드 안에 당신이 반환하고자하는 모든 것을 모을 수 있습니다. 그런 다음 해시를 생성하고 그것에'to_json'을하십시오. 또한 프로덕션 출력에 예쁜 JSON 출력을 사용하지 마십시오. 그것은 비대 해져서 서버, 블롭 (blob) 전송 및 반대편 파서를 느리게 만듭니다. –

+0

그래, JSON은 정확성보다는 개념의 증거로서 더 많이 존재 했었지만, 괄호 안에이 코드가 공식 코드가 아니며 분명히 그 코드를 사용했다. 당신이 말한 것에서 아이디어를 얻으려면 제 답변이 "아니오, 현재하고있는 것과 유사한 방법을 만들어야합니다"라고 들립니다. – incutonez

+0

또한 'Author.to_json'이 적합하지 않습니다. 클래스 메소드는 해당 클래스의 모든 객체에 대해 모든 것을 반환하지 않는 한 원하는 입도를 제공하지 않습니다. 대신에,'foo = Author.new' 다음에 그 인스턴스로 무엇인가를하면,'foo.to_json'가 더 이해할 수 있습니다. 그런 다음 Author의 해당 특정 인스턴스에 대한 정보 만 반환합니다. Sequel의 JSON 직렬 변환기는 훌륭하지만 일반적입니다. 귀하의 사용은 전문화되어 있습니다. –

답변

1

후계자의 json_serializer 플러그인은 이미 :include 옵션을 통해 연결을 지원합니다. 또한 협회를 수정해야합니다. 이 같은 것이 작동해야합니다.

Author.one_to_many :books 
Author.order(:id).to_json(:include=>:books) 
+0

그건 대단한데 ... 문제는 그것이 하나의 거대한 문자열이라는 것입니다.하지만 어딘가에 대한 수정을 보았을 수도 있습니다. 정말 고마워! 또한, 왜 내 연애가 잘못 되었습니까? – incutonez

+0

거대한 문자열은 무엇입니까? JSON 출력? 그렇다면 그것은 좋은 것입니다. 그것은 파서가 좋아하는 방식으로 효율적입니다. 인간은 일반적으로 출력물을 볼 필요가 없으며 JSON 플러그인이있는 브라우저는 들여 쓰거나 구조화되어 있어야합니다. –

+0

귀하의 연결은 다음을 사용합니다 : 책 및 not : books, 그리고 one_to_many associations는 복수형을 사용해야합니다. 사용한 key 및 : primary_key 옵션은 기본값과 동일하므로 필요하지 않습니다. –