English 中文(简体)
How to Store and Paginate XML Data as a Rails Model
原标题:

I have an XML feed I am pulling down and parsing in my Rails app. I started to implement it as a library in lib/ but it seemed more logical to me to treat it as a model. For convenience I am treating it as an ActiveRecord model. A requirement is that it is compatible with mislav s will_paginate plugin, although that is where I am having the issue.

I have created a class in app/models/ that inherits from ActiveRecord::Base and simply override the default method for find. If there s an easier way I m all ears. But this is working.

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

So with that working, the next step is try to paginate the collection. For this I am attempting to use mislav s will_paginate since I am using this plugin for my typical models. The issue is that will_paginate attempts to get a count of the number of total jobs. It does this by running a "SELECT count(*) AS count_all FROM jobs" automatically. Of course this fails since no such table exists.

Without modifying the code of will_paginate is there an easy way to correct this issue but still allow standard models to use will_paginate normally?

最佳回答

You can quite easily make any collection 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

This code maps the array into the WillPaginate::Collection - the size parameter is the record count, basically.

You can either implement something similar in your model, or not use ActiveRecord ... no real reason to unless you are going to be using validations and other things down the track.

问题回答

暂无回答




相关问题
rails collection_select vs. select

collection_select and select Rails helpers: Which one should I use? I can t see a difference in both ways. Both helpers take a collection and generates options tags inside a select tag. Is there a ...

SSL slowness in EC2

We ve deployed our rails app to EC2. In our setup, we have two proxies on small instances behind round-robin DNS. These run nginx load balancers for a dynamically growing and shrinking farm of web ...

Auth-code with A-Za-z0-9 to use in an URL parameter

As part of a web application I need an auth-code to pass as a URL parameter. I am currently using (in Rails) : Digest::SHA1.hexdigest((object_id + rand(255)).to_s) Which provides long strings like : ...

RubyCAS-Client question: Rails

I ve installed RubyCAS-Client version 2.1.0 as a plugin within a rails app. It s working, but I d like to remove the ?ticket= in the url. Is this possible?

activerecord has_many :through find with one sql call

I have a these 3 models: class User < ActiveRecord::Base has_many :permissions, :dependent => :destroy has_many :roles, :through => :permissions end class Permission < ActiveRecord::...

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

Text Editor for Ruby-on-Rails

guys which text editor is good for Rubyonrails? i m using Windows and i was using E-Texteditor but its not free n its expired now can anyone plese tell me any free texteditor? n which one is best an ...

How to get SQL queries for each user where env is production

I’m developing an application dedicated to generate statistical reports, I would like that user after saving their stat report they save sql queries too. To do that I wrote the following module: ...

热门标签