Rails 多条查询如何使用 模型内在的分页?(比如 Kaminari)

lin_style · 2012年05月04日 · 最后由 lin_style 回复于 2012年05月06日 · 6605 次阅读

Kaminari 的使用很简单,比如 Event 是个 model @events = Event.page(params[:page]).per(5)

如果我是多表查询,抓出来的是没有物件的,也就是说没法设定分页条件的查询。 比如 str_sql = "select * from users_messages t1 left join messages t2 on t1.message_id = t2.id where t1.id=%d" % [userid]

一口气都出来了,这个效率要怎么做呢?

好吧,我搜索到一个

paginate_by_sql

# Wrap an Array object to make it paginatable
# ==== Options
# * <tt>:limit</tt> - limit
# * <tt>:offset</tt> - offset
# * <tt>:total_count</tt> - total_count
def self.paginate_array(array, options = {})
  PaginatableArray.new array, options
end

https://github.com/amatsuda/kaminari/blob/master/lib/kaminari/models/array_extension.rb

在 Rails 也许应该尽量避免直接写 SQL。你的问题应该可以用 joins、include 解决。

#2 楼 @Rei 即使用 paginate_array,他的参数是个 array,也就是说,我的结果已经是全部查询出来了,他只是针对我的结果分页,而不是减少查询的返回值

#4 楼 @lin_style

  1. 你的需求其实可以用 includes 解决
  2. 纯 SQL 的时候,用 limit 和 offset 语句来实现分页
  3. paginate_array 传入 limit, offset, total_count 参数生产一个 PaginateArray 对象,是拿来给 paginate helper 用的。

#5 楼 @Rei

paginate_array 传入 limit, offset, total_count 参数生产一个 PaginateArray 对象,是拿来给 paginate helper 用的。

===这个是不是就是我 4 楼说的,只是针对我的结果分页,而不是减少查询的返回值

你的需求其实可以用 includes 解决 ===这个是不是跟 sql 语句带的 limit,offset 效果一样?在查询的时候就减少了返回值

#6 楼 @lin_style

  1. 是的
  2. 分页是用 limit, offset
  3. includes 是 ActiveRecord 中辅助多表查询的方法,除了 includes 还有 joins,区别是 select 部分不同。

LZ 的例子查询结果是关联表的内容,我很疑惑这个查询的目的啊。

User 和 Messages 的关系是 has_many 还是 has_and_belongs_to_many?一般状况用不着写 SQL 啊。

#8 楼 @Rei 是这种,http://ihower.tw/rails3/activerecord-relationships.html 多對多關聯 many-to-many。

我现在就是想需要一种,在语句里面就带有 limit offset,而且又有分页效果 paginate_by_sql 可以这样吗?

many-to-many 的话

user.messages.page(params:page]).per(5) 

就行了

#10 楼 @Rei 我发了封邮件到你的 [email protected] (非技术询问)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号