كيفية تخزين وتوصيل بيانات XML كنموذج القضبان

StackOverflow https://stackoverflow.com/questions/2089839

  •  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 ... لا يوجد سبب حقيقي لما لم تكن ستستخدم عمليات التحقق وأشياء أخرى أسفل المسار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top