كيفية تخزين وتوصيل بيانات XML كنموذج القضبان
-
21-09-2019 - |
سؤال
لديّ خلاصة XML التي أسحبها وأستقل في تطبيق Rails الخاص بي. بدأت في تنفيذها كمكتبة في LIB/ ولكن بدا لي أكثر منطقية بالنسبة لي لمعاملتها كنموذج. للراحة ، أتعامل معها كنموذج ActivereCord. من المتطلب أن يكون متوافقًا مع البرنامج المساعد Will_Paginate الخاص بـ Mislav ، على الرغم من أن هذا هو المكان الذي أواجه فيه المشكلة.
لقد قمت بإنشاء فصل في التطبيق/ النماذج/ ترث من ActivereCord :: Base وتجاوز ببساطة الطريقة الافتراضية للعثور. إذا كانت هناك طريقة أسهل فأنا كل آذان. لكن هذا يعمل.
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
لذلك مع هذا العمل ، فإن الخطوة التالية هي محاولة تراجع المجموعة. لهذا أحاول استخدام Will_Paginate من Mislav لأنني أستخدم هذا المكون الإضافي لنماذجي النموذجية. المشكلة هي أن Will_Paginate يحاول الحصول على عدد من إجمالي الوظائف. يقوم بذلك عن طريق تشغيل "تحديد العد (*) كـ COUNT_ALL من الوظائف" تلقائيًا. بالطبع هذا فشل لأنه لا يوجد مثل هذا الجدول.
بدون تعديل رمز Will_Paginate ، هل هناك طريقة سهلة لتصحيح هذه المشكلة ولكن لا تزال تسمح للمواد القياسية باستخدام Will_Paginate بشكل طبيعي؟
المحلول
يمكنك بسهولة جعل أي مجموعة 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 :: - بحجم المعلمة هي عدد السجلات ، بشكل أساسي.
يمكنك إما تنفيذ شيء مشابه في النموذج الخاص بك ، أو عدم استخدام ActivereCord ... لا يوجد سبب حقيقي لما لم تكن ستستخدم عمليات التحقق وأشياء أخرى أسفل المسار.