Как хранить и разбивать данные на XML как модель Rails - PullRequest
1 голос
/ 19 января 2010

У меня есть фид XML, который я собираю и анализирую в своем приложении Rails. Я начал реализовывать его как библиотеку в lib /, но мне показалось более логичным рассматривать его как модель. Для удобства я отношусь к нему как к модели ActiveRecord. Требование заключается в том, что он совместим с плагином will_paginate от mislav, хотя именно здесь у меня возникла проблема.

Я создал класс в app / models /, который наследуется от 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

Итак, следующим шагом будет попытка разбить коллекцию на страницы. Для этого я пытаюсь использовать mislav will_paginate, так как я использую этот плагин для своих типичных моделей. Проблема в том, что will_paginate пытается получить количество всех заданий. Это выполняется путем автоматического запуска «SELECT count (*) AS count_all FROM jobs». Конечно, это не удается, поскольку такой таблицы не существует.

Без изменения кода will_paginate есть простой способ исправить эту проблему, но все же разрешить стандартным моделям нормально использовать will_paginate?

1 Ответ

1 голос
/ 19 января 2010

Вы можете довольно легко сделать любую коллекцию разбитой на страницы (?).

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 :: Collection - параметр size , в основном, является количеством записей.

Вы можете либо реализовать нечто подобное в своей модели, либо не использовать ActiveRecord ... нет реальной причины, если только вы не собираетесь использовать проверки и другие вещи в будущем.

...