Wie zum Speichern und Paginate XML-Daten als Rails Modell
-
21-09-2019 - |
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?
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.