rails 3中分页的ActiveRecord限制/偏移量

时间:2013-05-05 18:56:06

标签: ruby-on-rails activerecord

我正在使用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

我确定我在这里搞了一大堆限制/偏移。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

我不是百分之百确定那里出现了什么问题,因为它看起来是正确的,但要看一下Kaminari gem,无论是来源还是实际使用它。

它基本上为您处理分页并使其真正易于使用。在你的例子中,与Kaminari你只是做

Topic.page(1).per(5)

您仍然可以添加所有条件,但它还附带了查看帮助程序以设置分页链接。

但正如我所说,看看宝石来源,看看它在做什么,并与你的进行比较,看起来是正确的。可能是MySQL的工作方式与我使用的其他DMBS一样,因为限制和偏移不符合您的预期。通过将查询限制为5个结果,您可能只需要5即可。如果你将其限制为5,那么你将其限制为5个结果,那么就没有更多的结果可以抵消吗?

我可能完全错误,所以我建议查看kaminari代码但只是预感:)