在我的rails应用程序中,我有一个看起来像这样的方法:
def find_person(field, attribute)
Person.where.not(Hash[field, nil])
.where.not("lower(#{field}) = ?", attribute.downcase)
.where("difference(#{field}, ?) < 2", attribute)
.order('RANDOM()')
.limit(3)
.pluck("lower(#{field})")
.uniq
end
由于.order('RANDOM()')
,此查询非常慢。如何更快地进行此查询?
答案 0 :(得分:1)
另一种方法,使用Ruby获取3个随机记录。
def find_person(field, attribute)
ids = Person.where.not(Hash[field, nil])
.where.not("lower(#{field}) = ?", attribute.downcase)
.where("difference(#{field}, ?) < 2", attribute)
.pluck("id")
Person.where(:id => ids.sample(3))
end
如果采取太慢,另一种方法。
def find_person(field, attribute)
q = Person.where.not(Hash[field, nil])
.where.not("lower(#{field}) = ?", attribute.downcase)
.where("difference(#{field}, ?) < 2", attribute)
max = q.count
offsets = [rand(max), rand(max), rand(max)]
offsets.map { |o| q.offset(o).limit(1).pluck("lower(#{field})").first }
end