【问题标题】:Rails Postgresql sort by randomRails Postgresql 随机排序
【发布时间】:2012-11-30 07:49:15
【问题描述】:

我正在尝试从 postgres 数据库中提取行,我可以将它们从 desc 中提取出来,但是当我尝试随机时,我得到一个接近随机的语法错误。

错误

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

将其拉出的代码

<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>

【问题讨论】:

  • 呃,你的代码示例没有使用random();它正在使用desc。那是正确的代码吗?另外,顺便说一句,您的查询应该进入您的控制器,而不是您的视图。最后,我建议在 Rails 控制台中测试类似的东西。
  • 如何将它添加到控制器然后调用它?
  • 只需输入@random_hashtags = Hashtag.order(...).limit(4),然后像@random_hashtags.each do...一样在您的视图中引用它。

标签: ruby-on-rails ruby-on-rails-3 postgresql ruby-on-rails-3.2


【解决方案1】:

要从数据库中获取随机条目,您有几个选择。这是一对

第一种方法

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

Hashtag.order("RANDOM()").limit(4)

第二种方法:

您也可以使用 ActiveRecord sample() 方法来检索 4 个随机行。

Hashtag.all.sample(4)

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

SQL: 1.8ms
Sample Method: 4.2ms

【讨论】:

  • 这就是我要找的。谢谢!
  • 这是选择其中一个的优势吗?
  • 其实我知道为什么这不起作用以及为什么我试图这样做&lt;% Hashtag.order("tweet_id rand").limit(4).each do |hashtag| %&gt; 是这样它只会从tweet_id 中提取与某个值匹配的随机行
  • 第二种方法较慢,因为它是 Ruby 代码选择随机而不是 SQL。它获取主题标签表中的每一行并随机选择 4,永远不要使用它。
【解决方案2】:

只是想说。我试图使用 postgres 对我的条目进行洗牌,但发现一个帖子 @instace.shuffle.each 做得更好。

【讨论】:

  • 您现在可能已经意识到这一点,因为这是几年后的事了,但这并不是最佳选择。您实际上是在加载 所有 记录,然后在它们都在内存中后进行洗牌。如果您需要一百万中的 5 条随机记录,则您的方法将需要加载整百万条记录。只是想把它放在那里。我还不知道更好的解决方案。
  • 随机播放方式不是最佳的,但对于我正在开发的一个较小的网站,我确实发现这种方式很有用:)
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 2012-11-19
  • 2012-03-16
  • 2012-01-05
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多