1

Rails 3 の一見単純なオフセット/制限ページネーション クエリに苦労しています。

クラス:

class Topic < ActiveRecord::Base

set_primary_key "thread_id"
set_table_name "threads"

belongs_to :forum_board
belongs_to :user

has_many :posts, :foreign_key => "thread_id", :dependent => :destroy

attr_accessible :board_id, :title, :modified_date, :status, :post_count, :user_id, :posts_attributes

accepts_nested_attributes_for :posts, :allow_destroy => :true

attr_accessor :board_title, :admin_mode, :orig_page_number, :page_number,
            :per_page, :last_page, :ban_list

クエリは次のとおりです。

Topic.includes(:posts, :user).where("threads.thread_id=? and messages.status=2", thread_id).order("messages.pdate").limit(per_page).offset(offset).first

問題は、オフセットが 1 を超えると結果が空になることです。たとえば、limit=5, offset=5 (20 行が利用可能) は失敗します。

また、子テーブルのクエリの前に次の SQL が実行されていることも確認していますが、実際には DISTINCT 句のために結果が返されません。

SELECT DISTINCT `threads`.thread_id FROM `threads` LEFT OUTER JOIN `messages` ON `messages`.`thread_id` = `threads`.`thread_id` LEFT OUTER JOIN `users` ON `users`.`user_id` = `threads`.`user_id` WHERE (threads.thread_id='20367' and messages.status=2) ORDER BY messages.pdate LIMIT 1 OFFSET 5

ここで制限/オフセットを混乱させたと確信しています。どんな助けでも感謝します。

4

1 に答える 1