我正在开发一个简单的应用来返回随机选择的exercises
,每个bodypart
一个。
bodypart
是enum
模型上的已编入索引的Exercise
列。 DB是PostgreSQL。
以下实现了我想要的结果,但感觉非常低效(每bodypart
点击一次db):
BODYPARTS = %w(legs core chest back shoulders).freeze
@exercises = BODYPARTS.map do |bp|
Exercise.public_send(bp).sample
end.shuffle
因此,这为每个exercise
提供了一个随机bodypart
,并在最后混合了订单。
我还可以将所有练习存储在内存中并从中选择;但是,我想这会有可怕的扩展(目前只有十几个种子记录)。
@exercises = Exercise.all
BODYPARTS.map do |bp|
@exercises.select { |e| e[:bodypart] == bp }.sample
end.shuffle
对这些进行基准测试表明select
方法在小范围内更有效:
Queries: 0.072902 0.020728 0.093630 ( 0.088008)
Select: 0.000962 0.000225 0.001187 ( 0.001113)
MrYoshiji's answer: 0.000072 0.000008 0.000080 ( 0.000072)
我的问题是,是否有一种有效的方法来实现此输出,如果是,那么这种方法可能是什么样子。理想情况下,我希望将其保留为单个数据库查询。
很高兴使用ActiveRecord或直接在SQL中撰写。任何想法都非常感激。