どのようにRailsのモデルとしてのストアとページ付けXMLデータへ
-
21-09-2019 - |
質問
私は、XMLは、私はプルダウンと私のRailsアプリで解析していますフィードがあります。私はlibにライブラリとしてそれを実装するために始めた/モデルとしてそれを治療するための私にはより論理的に思えました。利便性のために私はActiveRecordのモデルとしてそれを扱っております。要件は、私は問題を抱えていますところではあるが、それは、mislavのwill_paginateプラグインと互換性があることです。
私はActiveRecordの::基地から継承は、単に検索のデフォルトのメソッドをオーバーライドしていること/アプリ/モデルでクラスを作成しました。もっと簡単な方法があれば、私はすべての耳です。しかし、これは動作しています。
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試みは、全ジョブの数のカウントを取得するということです。これは、自動的に「ジョブからcount_all AS SELECT COUNT(*)」を実行してこれを行います。そのようなテーブルが存在しないので、もちろん、これは失敗します。
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の...あなたはトラックダウンの検証や他のものを使用してあることを行っている場合を除きに本当の理由を使用することはできません。