2009-12-27 2 views
1

특정 컨텍스트에서 모델의 필수 필드 만 가져 오는 방법을 찾을 수 없습니다. 약 30 개의 필드 (속성)가있는 거대한 모델이 있다고 가정 해 보겠습니다. 그러나 검색 목적을 위해서 나는 그들 중 단지 몇 개만 필요하다.DataMapper를 사용하여 지정된 필드의 필드 만 가져 오는 방법은 무엇입니까?

예 :

class Foo 
    include DataMapper::Resource 

    property :id, Serial 
    property :title, String, :length => 256 
    property :description, Text 
    property :url, String, :length => 4096 
    property :city, String, :length => 64 
    property :country, String, :length => 64 
    property :state, String, :length => 64 
    property :created_at, Time 
    property :updated_at, Time 
    property :expires_at, Time 
    ... etc fields ... 
end 

그래서, 프런트 엔드 (웹 응용 프로그램)에 대해 그 분야의 대부분이 사용된다. 그러나 검색을 위해서 나는 단지 제목 : : city, : state. 그 데이터를 쉽게 쿼리 할 수 ​​있습니다.

items = Foo.all(:title.like => 'Some stuff') 

그런 다음 가져온 데이터를 JSON에 압축해야합니다. 내가 아는 한, 모든 조작을 처리하는 dm-serialize라는 DataMapper 용 모듈이있다.

마지막으로, 내가 출력 패키지를 할 : 만 그 중 일부를 얻을 필요가있는 동안

response = {:error => 0, :count => items.length, :data => items} 
response.to_json 

그러나 출력 항목은 모든 필드를 가지고있다. 어떤 이유로 게으른 로딩이 작동하지 않습니다.

질문 : 선택하려는 모델 필드를 지정하는 방법은 무엇입니까?

답변

7
Foo.all(:fields=>[:title, :city, :state]) 
4

이 역시 넘어졌습니다.
또한 #to_json 메소드에 :only 옵션을 제공하십시오. 그렇지 않으면 아직 페치되지 않은 메소드를 지연로드합니다.

items.to_json(:only => [:title, :city, :state]) 

사용자가 직접 json 응답을 작성해야합니다. 그렇지 않으면 다른 필드의 lazy fetches가 발생합니다.

+0

감사합니다. to_json을 사용할 때 게으른로드를 강제로 수행하지 않는 방법에 대해 궁금합니다. – vitorbal