论坛首页 Ruby版 rails

如何对已经从数据库中搜索出来的实例变量进行分页(will_paginate)

浏览 2523 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
时间:2008-04-18
7thbyte 写道
shawnccx 写道


Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 5' at line 1: select * from movies order by rand() limit 20 LIMIT 0, 5

之前的问题我也意识到了,但现在由于分页为每页5个单位,导致sql语句有错误.



ummm...

先随机拿出20条再分页么。。

看来是一个子查询的问题。。

这么写吧... 子查询 as a 或者as xxx...

@movies=Movie.paginate_by_sql "select * from (select * from movies order by rand() limit 20) as a",   
:per_page => 5, :page => params[:page]


我用控制台测试了一下应该没问题



恩,可以了,非常感谢,我ror刚上手,在做一个小demo
   
0 请登录后投票
时间:2008-04-18
引用

ummm...

先随机拿出20条再分页么。。

看来是一个子查询的问题。。

这么写吧... 子查询 as a 或者as xxx...

@movies=Movie.paginate_by_sql "select * from (select * from movies order by rand() limit 20) as a",   
:per_page => 5, :page => params[:page]


我用控制台测试了一下应该没问题



我想改进一下,现在的情况每次翻页之后这随机的20部电影都在变化。(比如从第2页回到第1页后,现在的电影和之前第1页的不一样。)
我想改成翻页的时候这取出的20部电影不要变化。是不是要用到session

能不能说说具体做法
   
0 请登录后投票
时间:2008-04-18
在一次会话中保持搜索结果不变么..

试试这样:


# 如果session中没有保存movies_ids,则随机从数据库选取20条
unless session[:movies_ids]
  # 这里对取出的20条按id排序一下以保证后来的顺序
  top_movies=Movie.find_by_sql "select * from (select * from movies order by rand() limit 20) as a",     
   :order=>'id'

  movies_ids=Array.new
  top_movies.each do |m|
    movies_ids<<m.id
  end
  # 把取出的20部电影的id存入session中对象
  session[:movies_ids]=movies_ids
end

# 取session中movie_ids
@movies=Movie.paginate_by_id session[:movies_ids],:order=>'id',:per_page=>5,:page=>params[:page]



随便写的不太优美,因为一上来要多查一次数据库

还有优化的余地

代码未测试,可能有笔误
   
0 请登录后投票
时间:2008-04-18
7thbyte 写道
在一次会话中保持搜索结果不变么..

试试这样:


# 如果session中没有保存movies_ids,则随机从数据库选取20条
unless session[:movies_ids]
  # 这里对取出的20条按id排序一下以保证后来的顺序
  top_movies=Movie.find_by_sql "select * from (select * from movies order by rand() limit 20) as a",     
   :order=>'id'

  movies_ids=Array.new
  top_movies.each do |m|
    movies_ids<<m.id
  end
  # 把取出的20部电影的id存入session中对象
  session[:movies_ids]=movies_ids
end

# 取session中movie_ids
@movies=Movie.paginate_by_id session[:movies_ids],:order=>'id',:per_page=>5,:page=>params[:page


随便写的不太优美,因为一上来要多查一次数据库

还有优化的余地

代码未测试,可能有笔误



第五行把order排列放到sql语句里
 top_movies=Movie.find_by_sql "select * from (select * from movies order by rand() limit 20) as a order by id"      


   
0 请登录后投票
论坛首页 Ruby版 rails

跳转论坛:
JavaEye推荐