1

ランダムなレコードを選択しようとしていますが、唯一の有効な方法は、パフォーマンスの問題がひどいようです。

PostgresのRANDOM関数を使用した最初の試み-「ハッシュを整数に変換できません」をスローします

   assigned_specialist = User.specialists.legal_for(coach_section).experienced_in(critique.discipline_id).first(:order => "RANDOM()")
   return assigned_specialist.id

ここで説明するオフセット方法を使用した2回目の試行。また、「ハッシュを整数に変換できません」を引き起こします

  legal_specialists = User.specialists.legal_for(coach_section).experienced_in(critique.discipline_id)

  offset = rand(legal_specialists.count)
  assigned_specialist = legal_specialists.first(:offset => offset)
  return assigned_specialist.id

配列サンプルメソッドを使用した最後の試み。これは機能しますが、悪いようです。

  legal_specialists = User.specialists.legal_for(coach_section).experienced_in(critique.discipline_id)
  assigned_specialist = legal_specialists.sample
  return assigned_specialist.id

公平を期すために、システムには約20人のスペシャリストしかいないため、配列サンプルメソッドで問題が発生することはないかもしれませんが、ここで何が起こっているのかを理解したいと思います。

編集:これが私が定義したスコープです:

scope :specialists, where(:role_id => 2)
scope :legal_for, lambda { |coach_section| where("section_id != ?", coach_section) }
scope :experienced_in, lambda { |discipline_id|
  discipline = Discipline.find(discipline_id)
  discipline.users
} 
4

1 に答える 1

1

どうですか :

User.specialists.legal_for(coach_section).experienced_in(critique.discipline_id).sample

それはすべてのテーブルをクエリするので、短いバージョンしかありません...もっと良い方法があるのではないかと思います!

編集:これを試しましたか?それはうまくいくはずです:

assigned_specialist = User.specialists.legal_for(coach_section).experienced_in(critique.discipline_id).order("RANDOM()").first

こちらのスレッドをご覧ください: Rails 3: Get Random Record。それはそれを行うさまざまな方法を示しています

この宝石も見てください: https://github.com/spiliton/randumb あなたがやりたいことをきれいな方法で実装しているようです

編集:これに置き換えますか?

scope :experienced_in, lambda { |discipline_id| joins(:habtm_models).where(habtm_models: {discipline_id: discipline_id})}

このようにして、スコープはActiveRecord::Relationオブジェクトを返します。Userモデルを想定したhas_many :habtm_modelsので本名に置き換えてください!

于 2012-11-02T20:10:54.963 に答える