4

dbからランダムなレコードを選択する必要があります。私が開発で使用しているSqlite3には、Random()という関数があります。ただし、PostgresqlではRand()と呼ばれます。MySqlについては覚えていませんが、おそらくそこでそう呼ばれています。

したがって、(Sqlite3の)コードがある場合

data = Items.where(pubshied: is_pubshied).order("RANDOM()").limit(count)

さまざまなデータベースで確実に機能するようにするにはどうすればよいですか?

4

3 に答える 3

4

Rails は、そのままではこれをサポートしていません。モデル拡張でこれを達成したと思いますが(Postgresqlの使用を強制するため、もう使用しません)、次のようなものが機能する可能性があります。

module Randomize
  extend ActiveSupport::Concern

  included do
    scope :random, -> { order(rand_cmd) }
  end

  module ClassMethods
    def rand_cmd
      if connection.adapter_name =~ /mysql/i
        'rand()'
      else
        'random()'
      end
    end
  end
end

その後、次のことができます

class Item
  include Randomize
end

Item.where(...).random.limit(...)
于 2012-12-20T12:46:27.003 に答える
-1

waldyr.ar がコメントで言及している投稿のコメントから: https://stackoverflow.com/a/12038506/16784

Tl;dr: を使用できますItems.all.sample(count)。もちろん、これはテーブル全体を取得するため、大きなテーブルには役に立たない場合があります。

于 2012-12-20T13:24:34.653 に答える