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

时间:2012-01-02 18:07:47

标签: ruby-on-rails ruby-on-rails-3 sorting

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

Model.order("created_at ASC").limit(10)

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

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

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

另一种方法是将算法设置为model_entry.user_preference(user)。然后我可以通过以下方式订购:

Model.all.sort! { |b, a| a.user_preference(user) <=> b.user_preference(user) } 

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

我还没考虑其他途径吗?谁能指出我在这方面的正确方向?

2 个答案:

答案 0 :(得分:0)

冒泡排序效率不高。

如果您正在讨论对单个模型进行排序,那么所有排序输入都是该模型的属性。如果每个用户都可以指定自己的排序首选项,那么它将归结为属性或属性列表。将该列表保存为用户首选项,然后动态构造查询。哎呀,将实际代码保存为首选项并对其进行评估。

但是,即使有效的SQL在记录数接近阈值时也会崩溃。在这种情况下,您需要一个新工具。

您可以使用正确的搜索实现,其本质上包括排序。我使用Solr和太阳黑子宝石。似乎狮身人面像与思维 - 狮身人面像宝石也具有良好的牵引力。

答案 1 :(得分:0)

在这个解决方案中,我假设用户首选订单的计算费用很高,并且您订购的订单不经常更新。

您可以做的是每隔一段时间(在后台任务中)计算订单,并将计算的订单存储在每个用户的单独表格中。

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