我正在尝试使用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
知道如何解决这个问题吗?
答案 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集是否足够小 - 除了相对独特的标签之外)。