tagged_with order('random()')act-as-taggable-on

时间:2012-09-03 18:16:12

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord acts-as-taggable-on

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

Dvd.tagged_with(@site.tag, wild: true, any: true).order('RANDOM()').limit(20)

但我收到以下错误,

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

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我不使用Postgres - 但是从搜索开始 - 看起来像是从act_as_taggable-on tagged_with中被踢出的DISTINCT子句正在引发纠结(至少根据{{​​3}}

从帖子开始,您可以将其构建为使用AREL的子查询 - 类似于(我没有在任何地方在控制台中运行它,但这可能会为您提供指导)

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

这可能不是那么有效,但我的理解是ORDER BY RANDOM()也不是(我曾试图获得随机集的所有数据都是如此之小我可以加载所有这些,并使用Array #shuffle让ruby给我一个随机列表 - 我怀疑你的Dvd集是否足够小 - 除了相对独特的标签之外)。