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