无法将哈希转换为整数 - 尝试选择随机记录

时间:2012-11-02 20:07:08

标签: ruby-on-rails-3

我正在尝试选择随机记录,但唯一可行的方法似乎是一种可怕的性能责任。

使用Postgres的RANDOM函数进行首次尝试 - 抛出“无法将哈希转换为整数”

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

第二次尝试,使用offset method discussed here.同样导致“无法将哈希转换为整数”

  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
} 

1 个答案:

答案 0 :(得分: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/spilliton/randumb 似乎以干净的方式实现您想要做的事情

编辑:替换为此?

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

这样,您的范围将为您提供一个ActiveRecord::Relation对象。我假设User模型has_many :habtm_models,所以请换成真名!