3

変更点として、Railsアプリではなく、Ramaze、つまりSequelベースのアプリを使用しています。

結合テーブルを介して、および結合テーブルTagを介して多対多に関連付けられているモデルがあります。:posts:taggings:external_posts:external_post_taggings

これらの関連付けの両方をまとめて、created_at各テーブルで呼び出される日付フィールドで並べ替えたいと思います。

ページネーションなしで、私はします:

@combined = (@tag.posts + @tag.external_posts).sort_by(&:created_at).reverse

ただし、ページ付けを使用する必要があります。.postsだけの場合は、次のようにします。

@posts = @tag.posts.paginate(page, 10)

しかし、それが可能であるとしても、2つのテーブルにまたがる方法はわかりません。

4

1 に答える 1

4

タグと投稿の組み合わせをページ分割する場合は、2つの関連付けデータセットの和集合をページ分割する必要があります。

@tag.posts_dataset.
  union(@tag.external_posts_dataset).
  order(:created_at.desc).
  paginate(page, 10)

ただし、postsとexternal_postsが同じモデルクラスを使用しない限り、これには問題があります。別々のモデルクラスを使用する場合は、それぞれのオフセットを手動で追跡する必要がある場合があります。基本的に、ページごとに、両方の関連付けの次の10レコードを選択します(それぞれを適切なオフセットで開始します)。10の2つのグループを1つの配列に結合し、逆のcreated_atフィールドで並べ替えて、最初の10の結果を取得します。10個の結合/ソートされたレコードの配列内の投稿と外部投稿の数を数え、次のページで使用できるように、それに応じて投稿と外部投稿のオフセットを更新します。

たとえば、1ページでは、両方にオフセット0を使用します。結合、並べ替え、および最初の10を取得した後、10の配列に7つの投稿と3つの外部投稿がある場合、2ページで投稿を7でオフセットし、外部投稿を3でオフセットします。

于 2011-10-31T20:28:40.477 に答える