结果集数组RubyonRails上的默认逻辑排序

时间:2009-11-30 09:08:58

标签: ruby-on-rails activerecord enumerable

我通过定义这样的方法为ActiveRecord模型添加自定义排序:

class MyClass < ActiveRecord::Base
  belongs_to :parent_model #this would be the many in a has_many relationship

  def <=>(other)
    self.att <=> other.att
  end
end

可以这么说,比较中实际使用的逻辑比这个例子复杂一点,而且不是可以通过SQL实现的。

因为此类仅用作包含模型中的嵌套字段,所以似乎没有直接的位置来对结果集进行排序。在控制器中,:my_class是include for eager loading的一部分,但是在视图之前我没有对对象数组做任何其他事情(当我执行form.fields_for:my_class时)。我真正想要的是能够使用我的逻辑排序来执行相当于default_scope的操作,但我认为这不可行。现在,我唯一的选择似乎是在控制器中添加一个额外的行来对这个结果进行排序,但这似乎不是正确的事情。

我在这里找不到更优雅的东西吗?

2 个答案:

答案 0 :(得分:0)

最好的方法是设置数据库以进行SQL排序,并在范围/查找中提供:order选项。一旦加载的对象数超过某个阈值,在控制器中进行排序将非常昂贵。特别是如果你试图限制列出的记录数量。

如果排序真的比排序这个列更复杂。您应该考虑在数据库中添加排序键列。你已经清楚地找到了一些排序方法,通常涉及比较从对象状态派生的两个值。只需将该值存储在新sort_key列的数据库中,并使用before_create / save回调并按顺序对结果进行排序。

任务示例:

按优先顺序排序,但截止日期为星期五的记录将列在所有其他日期之前。使用sort_key列

class Task < ActiveRecord::Base
  def calculate_sort_key
    key = due_date.wday == 5 ? "0" : "1"
    key += prioirty.to_s
    self.sort_key = key.to_i
  end

  before_save :calculate_sort_key
  default_scope :order => "sort_key"
end

答案 1 :(得分:0)

我无法测试这是否可行,但您可以尝试匿名关联模块,如下所示:

class ParentModel < ActiveRecord::Base
  has_many :my_class do
    # Sort the result set...  
  end
end
相关问题