首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >acts-as-taggable-on随机顺序(‘tagged_with ()’)

acts-as-taggable-on随机顺序(‘tagged_with ()’)
EN

Stack Overflow用户
提问于 2012-09-04 02:16:12
回答 1查看 470关注 0票数 1

我正在尝试将act-as-taggable-on的tagged_with方法用于这样的random()订单,

代码语言:javascript
复制
Dvd.tagged_with(@site.tag, wild: true, any: true).order('RANDOM()').limit(20)

但是我得到了以下错误,

代码语言:javascript
复制
ActiveRecord::StatementInvalid: PG::Error: ERROR:  for SELECT DISTINCT, ORDER BY     expressions must appear in select list
LINE 1: ... OR dvds_taggings_c684506.tag_id = 3786) ORDER BY RANDOM() L...
                                                         ^
: SELECT  DISTINCT dvds.* FROM "dvds" JOIN taggings dvds_taggings_c684506  ON     dvds_taggings_c684506.taggable_id = "dvds".id AND dvds_taggings_c684506.taggable_type = 'Dvd' WHERE (dvds_taggings_c684506.tag_id = 72 OR dvds_taggings_c684506.tag_id = 2823 OR dvds_taggings_c684506.tag_id = 3786) ORDER BY RANDOM() LIMIT 20

你知道怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2012-09-04 04:50:17

我不使用Postgres -但从搜索来看-看起来从act_as_taggable-on的tagged_with中剔除的DISTINCT子句给事情带来了一些麻烦(至少根据this pgsql thread的说法

在这篇文章之后,你可能可以使用AREL将其构建为一个子查询-类似于(我还没有在任何地方的控制台中运行过这个,但这可能会给你一个继续的方向)

代码语言:javascript
复制
class Dvd < ActiveRecord::Base

  def self.random_list(limit = 20)
    with_scope do
      subquery = self.tagged_with(@site.tag, wild: true, any: true).pluck(:id)
      self.where("ID IN(#{subquery.to_sql})").order("RANDOM()").limit(limit)
    end
  end

end

它可能并不是那么有效,但我对RANDOM()排序的理解也不是那么有效(我曾经试图从随机集获取的所有数据都非常小,我可以加载所有的数据,然后使用Array#shuffle让ruby给我一个随机列表-我怀疑你的Dvd集是否足够小-除了相对唯一的标签)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12252465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档