2010-01-18 5 views
1

XML 피드가 있습니다. 레일즈 애플리케이션에서 당겨서 파싱하고 있습니다. lib/lib에 라이브러리로 구현하기 시작했지만 모델로 취급하는 것이 더 논리적 인 것처럼 보였습니다. 편의상 ActiveRecord 모델로 취급하고 있습니다. 요구 사항은 mislav의 will_paginate 플러그인과 호환된다는 것인데, 그것이 내가 문제가있는 곳이기는하지만.XML 데이터를 레일스 모델로 저장하고 페이지를 매기는 방법

ActiveRecord :: Base에서 상속받은 클래스를 app/models /에 만들고 단순히 find 메소드의 기본 메소드를 대체합니다. 더 쉬운 방법이 있다면 나는 모두 귀입니다. 그러나 이것은 효과적입니다.

class Job < ActiveRecord::Base 
    def self.columns() @columns ||= []; end 

    def self.column(name, sql_type = nil, default = nil, null = true) 
    columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null) 
    end 

    column :title, :string 
    column :company, :string 

    def self.find(*args) 
    url = "http://example.com" 

    xml = Net::HTTP.get_response(URI.parse(url)).body 
    doc = REXML::Document.new(xml) 

    if args.first.to_s == 'all' 
     results = Array.new 

     doc.elements.each('response/results/result') do |r| 
     job = self.new(
      :title => r.elements['jobtitle'].text, 
      :company => r.elements['company'].text 
     ) 

     results.push(job) 
     end 

     results 
    end 
    end 
end 

그래서 그 다음 단계는 컬렉션에 페이지 매김을 시도하는 것입니다. 이를 위해 필자는 전형적 모델에이 플러그인을 사용하고 있기 때문에 mislav의 will_paginate를 사용하려고 시도하고 있습니다. 문제는 will_paginate가 총 작업 수를 계산하려고 시도한다는 것입니다. "SELECT count (*) AS count_all FROM jobs"를 자동으로 실행하여이를 수행합니다. 물론 테이블이 존재하지 않기 때문에 실패합니다.

will_paginate 코드를 수정하지 않고도이 문제를 해결할 수있는 간단한 방법이 있지만 표준 모델이 will_paginate를 정상적으로 사용할 수 있도록 허용할까요?

답변

1

어떤 컬렉션을 페이지 매김 (?)으로 만들 수 있습니다.

Array.class_eval do 
    def paginate(page = 1, per_page = 10) 
    WillPaginate::Collection.create(page, per_page, size) do |pager| 
     pager.replace self[pager.offset, pager.per_page].to_a 
    end 
    end 
end 

이 코드는 WillPaginate :: 컬렉션에 배열을 매핑 - 크기 매개 변수는 기본적으로, 레코드 수입니다.

모델에서 비슷한 것을 구현하거나 ActiveRecord를 사용하지 않을 수 있습니다 ... 유효성 검사 및 기타 작업을 트랙을 사용하지 않는 한 진짜 이유는 없습니다.

관련 문제