Rails 3中的自定义,高效,复杂的排序

jay*_*jay 5 sorting ruby-on-rails ruby-on-rails-3

我想知道如何在Rails中有效地订购.我们都知道您可以使用以下方法在Rails中进行简单排序:

Model.order("created_at ASC").limit(10)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只是拉前10个条目.如果我想添加非时间描述的排序,我可以在模型中创建一个列(例如custom_ordering column)并输入值来排序对象.那种情况你只需修改order("custom_ordering ASC")通话.

但是,假设我想根据用户的预测偏好进行订购.在这种情况下,创建新列是不可行的,因为每个用户都有不同的口味.什么是完成这项任务的智能,有效的方法?

一种方法是创建一个算法来预测用户对来自Model的对象的评级model_rating(object).该算法将吐出其评级的正整数值.如果我沿着这条路走下去,我将如何有效地订购模型?

另一种方法是将算法设置为a model_entry.user_preference(user).然后我可以点击:

Model.all.sort! { |b, a| a.user_preference(user) <=> b.user_preference(user) } 
Run Code Online (Sandbox Code Playgroud)

但这让我觉得效率低下.它必须调用模型中的所有条目,然后对它们进行排序,即使您使用合并或冒泡排序等有效排序方法,也会在具有大量条目的模型上获得较差的性能.

还有其他我不考虑的路径吗?任何人都能指出我在正确的方向吗?

Ber*_*als 0

在此解决方案中,我假设用户首选订单的计算成本很高,并且您订购的集合不会经常更新。

您可以做的是经常计算订单(在后台任务中)并将计算出的订单存储在每个用户的单独表中。

或者,如果您没有很多用户,您可以将每个用户每个模型的分数保存在单独的表中,并在联接中按该值排序。这些值也可以定期重新计算。