2010-01-18 22 views
1

我有一個XML feed,我正在下拉並在我的Rails應用程序中解析。我開始將它作爲一個lib庫來實現,但我認爲將它當作一個模型是合乎邏輯的。爲了方便起見,我將其視爲ActiveRecord模型。一個要求是它與mislav的will_paginate插件兼容,儘管這是我遇到問題的地方。如何將XML數據作爲Rails模型進行存儲和分頁

我已經在app/models /中創建了一個類,它繼承自ActiveRecord :: Base,並簡單地覆蓋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

你可以很容易地做任何收集paginatable(?)。

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 ::收藏地圖 - The 大小參數是記錄數,基本上是這樣。

你可以在你的模型中實現類似的東西,或者不使用ActiveRecord ...沒有真正的理由,除非你打算在賽道上使用驗證和其他東西。

相關問題