Frage

Ich habe eine XML-Feed Ich bin nach unten ziehen und dem Parsen in meiner Rails-Anwendung. Ich begann es als Bibliothek in lib zu implementieren / aber es schien logisch für mich ist es als Modell zu behandeln. Der Einfachheit halber ich es als Active Modell am behandeln. Voraussetzung ist, dass es mit mislav des will_paginate Plugin kompatibel ist, aber das ist, wo ich das Problem habe.

Ich habe eine Klasse in app / Modelle erstellt / die erbt von Activerecord :: Base und einfach die Standardmethode für die Entdeckung außer Kraft setzen. Wenn es ein einfacherer Weg, bin ich ganz Ohr. Aber das funktioniert.

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

Also mit diesem arbeiten, ist der nächste Schritt versuchen, die Sammlung Paginieren. Dafür bin ich versucht, mislav die will_paginate zu verwenden, da ich dieses Plugin für meine typischen Modelle verwende. Das Problem ist, dass will_paginate Versuche, eine Zählung der Anzahl aller Arbeitsplätze zu erhalten. Es tut dies durch ein "SELECT COUNT (*) AS count_all aus Jobs" automatisch ausgeführt wird. Natürlich scheitert dies, da keine solche Tabelle vorhanden ist.

Ohne den Code will_paginate Modifizierung ist es eine einfache Möglichkeit, dieses Problem zu beheben, aber immer noch erlauben, Standardmodelle will_paginate normal zu benutzen?

War es hilfreich?

Lösung

Sie können ganz einfach eine beliebige Sammlung paginatable machen (?).

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

Dieser Code bildet das Array in die WillPaginate :: Collection -. Größe Parameter ist die Anzahl der Datensätze, im Grunde

Sie können entweder etwas ähnliches in Ihrem Modell implementieren, oder nicht Active verwenden ... keinen wirklichen Grund, es sei denn Sie gehen mit Validierungen und andere Dinge auf der Spur zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top