我正在尝试将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你知道怎么解决这个问题吗?
发布于 2012-09-04 04:50:17
我不使用Postgres -但从搜索来看-看起来从act_as_taggable-on的tagged_with中剔除的DISTINCT子句给事情带来了一些麻烦(至少根据this pgsql thread的说法
在这篇文章之后,你可能可以使用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它可能并不是那么有效,但我对RANDOM()排序的理解也不是那么有效(我曾经试图从随机集获取的所有数据都非常小,我可以加载所有的数据,然后使用Array#shuffle让ruby给我一个随机列表-我怀疑你的Dvd集是否足够小-除了相对唯一的标签)。
https://stackoverflow.com/questions/12252465
复制相似问题