Rails Postgresql随机排序

the*_*s11 8 postgresql ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我试图从postgres数据库中提取行,我可以将它们拉出来但是当我尝试随机时,我会在随机附近得到一个语法错误.

错误

PG::Error: ERROR:  syntax error at or near "rand"
LINE 1: ...  "hashtags".* FROM "hashtags"  ORDER BY tweet_id rand LIMIT...
                                                             ^
: SELECT  "hashtags".* FROM "hashtags"  ORDER BY tweet_id rand LIMIT 4
Run Code Online (Sandbox Code Playgroud)

把它拉出来的代码

<div id="hashtags">
<% Hashtag.order("tweet_id desc").limit(4).each do |hashtag| %>
   <blockquote><%= hashtag.content %></blockquote>
   <div class="from">&mdash; @<%= hashtag.screen_name %></div>
 <% end %>
</div>
Run Code Online (Sandbox Code Playgroud)

hrr*_*hrr 19

要从数据库中获取随机条目,您有几个选项.这是一对夫妇

第一种方法

这将使用SQL从数据库中取出4个随机条目.

Hashtag.order("RANDOM()").limit(4)
Run Code Online (Sandbox Code Playgroud)

第二种方法:

您还可以使用ActiveRecord sample()方法检索4个随机行.

Hashtag.all.sample(4)
Run Code Online (Sandbox Code Playgroud)

由于速度和效率; 我制作了一个迷你基准测试并在我自己的数据库上测试了两个命令(包含500条记录).第一种方法(如预期的那样)比第二种方法快两倍以上.

SQL: 1.8ms
Sample Method: 4.2ms
Run Code Online (Sandbox Code Playgroud)

  • 第二种方法比较慢,因为Ruby代码选择随机而不是SQL.它获取hashtags表中的每一行并随机选择4,从不使用它. (2认同)