1

我正在尝试将 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

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

4

1 回答 1

1

我不使用 Postgres - 但从搜索中 - 看起来从 act_as_taggable-on's 中被踢出的 DISTINCT 子句正在引发tagged_with问题(至少根据这个 pgsql 线程

从那篇文章开始,您可能可以使用 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 设备是否足够小——除了相对独特的标签)。

于 2012-09-03T20:50:17.100 回答