小编jky*_*kym的帖子

Rails 3,will_paginate,随机,重复记录,Postgres,setseed失败

我有一个带属性的电影数据库.我想以随机顺序将查询过的一批电影返回到带分页的模板.我正在使用will_paginate.我尝试了以下方法:

## MoviesController

movies = Movie.get_movies(query_string)   # a method in Movie model that takes in 
                                          # a query_string and fetches movies 
                                          # with user-set params

@movies = movies.order('random()').page(params[:page]).per_page(16)
Run Code Online (Sandbox Code Playgroud)

这很好用,除了电影在页面之间重复.此问题的解决方案已在此处此处发布.这些链接解释了这一点,因为random()种子在页面之间重置,所以没有一致性,并且OFFSET变得无用.它们为MySQL用户提供了很好的解决方案,因为它的rand(n)函数需要种子n.然而,Postgres并没有这样做.在ORDER中发出random()之前,必须 在SELECT中声明setseed(n).

所以我尝试了postgres方式来设置种子:

@movies = movies.select('setseed(.5)').order('random()').page(params[:page]).per_page(16)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,返回的Movie对象完全没有属性.从模板中提出以下内容:

Movies#action中的ActiveModel :: MissingAttributeError

缺少属性:some_movie_attribute

我调试了这个,一旦堆栈到达action_controller/metal,@ mobies包含:

[#<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie >, #<Movie …

random postgresql ruby-on-rails will-paginate ruby-on-rails-3

5
推荐指数
1
解决办法
2409
查看次数