我正在尝试选择随机记录,但唯一可行的方法似乎是一种可怕的性能责任。
使用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
}
答案 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
,所以请换成真名!