1

我有一个 XML 提要,我正在拉下并在我的 Rails 应用程序中解析。我开始将它实现为 lib/ 中的一个库,但对我来说将它视为一个模型似乎更合乎逻辑。为方便起见,我将其视为 ActiveRecord 模型。一个要求是它与 mislav 的 will_paginate 插件兼容,尽管这是我遇到问题的地方。

我在 app/models/ 中创建了一个继承自 ActiveRecord::Base 的类,并简单地覆盖了 find 的默认方法。如果有更简单的方法,我会全力以赴。但这是有效的。

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?

4

1 回答 1

1

您可以很容易地使任何集合可分页(?)。

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 ...没有真正的理由,除非你打算使用验证和其他东西。

于 2010-01-19T01:58:02.167 回答