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から追い出されている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 に答える