8

ここで本当に単純なものが欠けていることを確信しています:

プロファイルとグループという 2 つの異なるモデルのインスタンスを含む一連のページを表示しようとしています。名前属性で並べ替える必要があります。モデルごとにすべてのインスタンスを選択し、それらを並べ替えてページ番号を付けることもできますが、これはずさんで非効率的です。

私はmislav-will_paginateを使用していますが、これを達成するためのより良い方法があるかどうか疑問に思っていましたか? 何かのようなもの:

[Profile, Group].paginate(...)

理想的でしょう!

4

4 に答える 4

7

良い質問です。同じ問題に数回遭遇しました。毎回、SQL ユニオンに基づいて独自の SQL クエリを作成することで終了しました (SQLite と mysql で正常に動作します)。次に、結果を渡すことでページ分割を使用できます ( http://www.pathf.com/blogs/2008/06/how-to-use-will_paginate-with-non-activerecord-collectionarray/ )。すべての行をカウントするクエリを実行することを忘れないでください。

いくつかのコード行 (テストされていません)

my_query = "(select posts.title from posts) UNIONS (select profiles.name from profiles)"
total_entries = ActiveRecord::Base.connection.execute("select count(*) as count from (#{my_query})").first['count'].to_i

results = ActiveRecord::Base.connection.select_rows("select * from (#{my_query}) limit #{limit} offset #{offset}")

やり過ぎですか?たぶん、クエリの数は最小限であり、結果は一貫しています。

それが役に立てば幸い。

注: http パラメータからオフセット値を取得する場合は、sanitize_sql_for_conditions を使用する必要があります (つまり、SQL インジェクション ....)。

于 2009-09-02T21:48:41.077 に答える
1

次のようなことを行うと、近づくことができます。

@profiles, @groups = [Profile, Group].map do |clazz|
  clazz.paginate(:page => params[clazz.to_s.downcase + "_page"], :order => 'name')
end

次に、ページ パラメータprofile_pageとを使用してページ分割しますgroup_page。ビューで呼び出しを取得してwill_paginate、次を使用して正しいページを使用できます。

<%= will_paginate @profiles, :page_param => 'profile_page' %>
....
<%= will_paginate @groups, :page_param => 'group_page' %>

それでも、セットアップし@groups@profiles個別に行うことに大きなメリットがあるかどうかはわかりません。

于 2009-07-07T21:19:57.957 に答える
1

前回のプロジェクトで問題が発生しました。検索機能で複数のモデルを単一のページ付けでページ付けする必要がありました。Facebookフィードのように、最初のモデルの結果が2番目のモデルの結果に続き、3番目のモデルが1つの検索フィードとして続くときに、最初のモデルが最初に表示されるように機能する必要があります。これは、この機能を実行するために作成した関数です

def multi_paginate(models, page, per_page)

  WillPaginate::Collection.create(page, per_page) do |pager|

    # set total entries
    pager.total_entries = 0
    counts = [0]
    offsets = []
    for model in models
          pager.total_entries += model.count
          counts << model.count
          offset = pager.offset-(offsets[-1] || 0)
          offset = offset>model.count ? model.count : offset 
          offsets << (offset<0 ? 0 : offset)
    end

    result = []
    for i in 0...models.count
          result += models[i].limit(pager.per_page-result.length).offset(offsets[i]).to_a
    end

    pager.replace(result)
  end

end

試してみて、問題があれば教えてください。また、問題として will_paginate リポジトリに投稿しました。誰もが正しく動作することを確認したら、フォークしてライブラリにコミットします。 https://github.com/mislav/will_paginate/issues/351

于 2014-01-16T12:29:47.913 に答える
0

独自のページネーターを使用して 2 つの異なる結果セットを表示し、AJAX 経由で更新しようとしましたか? それはまさにあなたが望むものではありませんが、結果は似ています。

于 2009-07-07T14:04:52.673 に答える