1

我正在尝试选择一个随机记录,但唯一的工作方法似乎是一种可怕的性能负担。

第一次尝试,使用 Postgres 中的 RANDOM 函数 - 抛出“无法将哈希转换为整数”

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

第二次尝试,使用这里讨论的偏移方法。还会导致“无法将哈希转换为整数”

  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:获取随机记录。它显示了不同的方法来做到这一点

另请查看此 gem:https ://github.com/spiilliton/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 回答